Cod sursa(job #1816938)

Utilizator tgm000Tudor Mocioi tgm000 Data 27 noiembrie 2016 10:12:42
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<cstdio>
int arb[400001];
int maxi(int a,int b){
   if(a>b)
      return a;
   else
      return b;
}
void build(int nod,int st,int dr,FILE *fin){
   if(st==dr){
      fscanf(fin,"%d",&arb[nod]);
      return;
   }
   int mid=(st+dr)/2;
   build(2*nod,st,mid,fin);
   build(2*nod+1,mid+1,dr,fin);
   arb[nod]=maxi(arb[2*nod],arb[2*nod+1]);
}
void update(int nod,int st,int dr,int poz,int val){
   if(st==dr){
      arb[nod]=val;
      return;
   }
   int mid=(st+dr)/2;
   if(poz<=mid)
      update(2*nod,st,mid,poz,val);
   else
      update(2*nod+1,mid+1,dr,poz,val);
   arb[nod]=maxi(arb[2*nod],arb[2*nod+1]);
}
int query(int nod,int l,int r,int st,int dr){
   if(st<=l&&r<=dr)
      return arb[nod];
   int mid=(l+r)/2;
   if(dr<=mid)
      return query(2*nod,l,mid,st,dr);
   if(st>mid)
      return query(2*nod+1,mid+1,r,st,dr);
   return maxi(query(2*nod,l,mid,st,dr),query(2*nod+1,mid+1,r,st,dr));
}
int main(){
   int n,m,i,o,a,b;
   freopen("arbint.in","r",stdin);
   freopen("arbint.out","w",stdout);
   scanf("%d%d",&n,&m);
   build(1,1,n,stdin);
   for(i=1;i<=m;i++){
      scanf("%d%d%d",&o,&a,&b);
      if(o==0)
         printf("%d\n",query(1,1,n,a,b));
      else
         update(1,1,n,a,b);
   }
   return 0;
}