Cod sursa(job #1374692)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 5 martie 2015 10:28:54
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>
#define DIM 100005

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int N,v[4*DIM],M,op,a,b,maxim;
void build(int nod,int p,int u){
    if(p==u){
        fin>>v[nod];
        return;
    }
    int mid=(p+u)>>1;
    build(2*nod,p,mid);
    build(2*nod+1,mid+1,u);
    v[nod]=max(v[2*nod],v[2*nod+1]);
}
void update(int nod,int p,int u,int a,int val){
    if(p==u && p==a){
        v[nod]=val;
        return;
    }
    int mid=(p+u)>>1;
    if(a<=mid)
        update(2*nod,p,mid,a,val);
    if(a>mid)
        update(2*nod+1,mid+1,u,a,val);
    v[nod]=max(v[2*nod],v[2*nod+1]);
}
void query(int nod,int p,int u,int a,int b){
    if(p>=a && u<=b){
        maxim=max(maxim,v[nod]);
        return;
    }
    int mid=(p+u)>>1;
    if(mid>=a)
        query(2*nod,p,mid,a,b);
    if(mid+1<=b)
        query(2*nod+1,mid+1,u,a,b);
}
int main(){
    fin>>N>>M;
    build(1,1,N);
    while(M--){
        fin>>op>>a>>b;
        if(op==0){
            maxim=-0x3f3f3f3f;
            query(1,1,N,a,b);
            fout<<maxim<<"\n";
        }
        if(op==1)
            update(1,1,N,a,b);
    }
    fin.close();fout.close();
    return 0;
}