Cod sursa(job #2309681)

Utilizator pasoi_stefanPasoi Stefan pasoi_stefan Data 29 decembrie 2018 16:58:21
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include<fstream>

using namespace std;

ifstream cin("arbint.in");
ofstream cout("arbint.out");

int n,m,arb[400005],x,y,op,maxim;

void SeekElements(int node,int left,int right){

    if(left==right){

        cout<<arb[node]<<' ';
        return ;

    }

    int middle=(left+right)/2;

    SeekElements(2*node,left,middle);
    SeekElements(2*node+1,middle+1,right);

    if(node==1) cout<<'\n';

}

void Update(int node,int left,int right,int index,int value){

    if(left==right){

        arb[node]=value;
        return ;

    }

    int middle=(left+right)/2;

    if(index<=middle)

        Update(2*node,left,middle,index,value);

    else

        Update(2*node+1,middle+1,right,index,value);

    arb[node]=max(arb[2*node],arb[2*node+1]);

}

void Query(int node,int left,int right,int a,int b){

    if(a<=left && right<=b){

        maxim=max(maxim,arb[node]);
        return ;

    }

    int middle=(left+right)/2;

    if(a<=middle) Query(2*node,left,middle,a,b);
    if(middle+1<=b) Query(2*node+1,middle+1,right,a,b);

}

int main(){

    cin>>n>>m;

    for(int i=1;i<=n;i++){

        cin>>x;
        Update(1,1,n,i,x);

    }

    while(m--){

        cin>>op>>x>>y;

        if(op==0){

            maxim=0;
            Query(1,1,n,x,y);
            cout<<maxim<<'\n';

        }



        else

            Update(1,1,n,x,y);

    }

}