Cod sursa(job #2308149)

Utilizator pasoi_stefanPasoi Stefan pasoi_stefan Data 26 decembrie 2018 14:50:58
Problema Arbori de intervale Scor 40
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include<fstream>

using namespace std;

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

int Sg[200001],V[100001],n,m,op,x,y;

int ConstructSegmentTree(int node,int st,int dr){

    if(st==dr){

        Sg[node]=V[st];
        return Sg[node];
    }

    int mid=(st+dr)/2;

    Sg[node]=max(ConstructSegmentTree(2*node,st,mid),
                 ConstructSegmentTree(2*node+1,mid+1,dr));

    return Sg[node];

}

int Query(int node,int st,int dr,int a,int b){

    if(a<=st && dr<=b){

        return Sg[node];

    }

    if(st>b || dr<a) return 0;

    int mid=(st+dr)/2;

    return max(Query(2*node,st,mid,a,b),
               Query(2*node+1,mid+1,dr,a,b));

}

void Update(int node,int st,int dr,int i,int x){

    if(st==dr && i==st){

        Sg[node]=x;
        return ;

    }

    if(st<=i && i<=dr){

        int mid=(st+dr)/2;

        Update(2*node,st,mid,i,x);
        Update(2*node+1,mid+1,dr,i,x);

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

    }

}

int main(){

    cin>>n>>m;

    for(int i=1;i<=n;i++)
        cin>>V[i];

    ConstructSegmentTree(1,1,n);

    while(m--){

        cin>>op>>x>>y;

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

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

    }

}