Cod sursa(job #1777043)

Utilizator PopoviciRobertPopovici Robert PopoviciRobert Data 12 octombrie 2016 00:18:16
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda cerculdeinfo-lectia2-arborideintervale Marime 1.24 kb
#include <cstdio>
#define MAXN 100000
int aint[4*MAXN+1];
inline int getmax(int a,int b){
    if(a<b) return b;
    return a;
}
void update(int nod,int left,int right,int poz,int val){
    if(left==right)
       aint[nod]=val;
    else{
        int mid=(left+right)/2;
        if(poz<=mid)
           update(2*nod,left,mid,poz,val);
        else
           update(2*nod+1,mid+1,right,poz,val);
        aint[nod]=getmax(aint[2*nod+1],aint[2*nod]);
    }
}
int max;
void querry(int nod,int left,int right,int l,int r){
    if(l<=left&&right<=r){
       if(max<aint[nod])
          max=aint[nod];
    }
    else{
       int mid=(left+right)/2;
       if(l<=mid)
          querry(2*nod,left,mid,l,r);
       if(mid<r)
          querry(2*nod+1,mid+1,right,l,r);
    }
}
int main(){
    FILE*fi,*fout;
    int i,n,m,t,a,b,nr;
    fi=fopen("arbint.in" ,"r");
    fout=fopen("arbint.out" ,"w");
    fscanf(fi,"%d%d" ,&n,&m);
    for(i=1;i<=n;i++){
       fscanf(fi,"%d" ,&nr);
       update(1,1,n,i,nr);
    }
    for(i=0;i<m;i++){
       fscanf(fi,"%d%d%d" ,&t,&a,&b);
       if(t==0){
          max=0;
          querry(1,1,n,a,b);
          fprintf(fout,"%d\n" ,max);
       }
       else
           update(1,1,n,a,b);
    }
    fclose(fi);
    fclose(fout);
    return 0;
}