Cod sursa(job #2436691)

Utilizator Adrian_Popescu311Popescu Adrian Adrian_Popescu311 Data 6 iulie 2019 18:19:58
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <iostream>
#include <fstream>
#include <assert.h>

using namespace std;

#define dim 100001

ifstream fi("arbint.in");
ofstream fo("arbint.out");

long int MaxArb[4*dim+66];
long int n,m;
long int Val,Poz;
long int maxim,start,finish;

long int maxi(long int a,long int b)
{
    if(a>b)
        return a;
    else
        return b;
}

void update(long int,long int,long int);
void query (long int,long int,long int);

int main()
{
    fi>>n>>m;

    for(long int i=1;i<=n;i++)
    {
        long int x;
        fi>>x;
        Val=x;
        Poz=i;
        update(1,1,n);
    }

    long int a,b,x;

    for(long int i=1;i<=m;i++)
    {

        fi>>x>>a>>b;

        if(!x)
        {
            maxim=-1;
            start=a;
            finish=b;
            query(1,1,n);
            fo<<maxim<<endl;
        }
        else
        {
            Poz=a;
            Val=b;
            update(1,1,n);
        }

    }
}

void update(long int nod,long int left,long int right)
{
    if(left==right)
    {
        MaxArb[nod]=Val;
        return;
    }

    long int div=(left+right)/2;

    if(Poz<=div)
        update(nod*2,left,div);
    else
        update(nod*2+1,div+1,right);

    MaxArb[nod]=maxi(MaxArb[2*nod],MaxArb[2*nod+1]);
}

void query(long int nod,long int left,long int right)
{
    if(start<=left && right<=finish)
    {
        if(maxim<MaxArb[nod])
            {maxim=MaxArb[nod];
            return;}
    }

    long int div=(left+right)/2;

    if(start<=div)
        query(2*nod,left,div);
    if(div<finish)
        query(2*nod+1,div+1,right);
}