Cod sursa(job #164135)

Utilizator mihai_floreaFlorea Mihai Alexandru mihai_florea Data 23 martie 2008 16:18:40
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
//arbori de intervale
#include <cstdio>
#define max(a,b) (a>b ? a:b)
int n,m,v[400002],x,a,b,maxim,i;
void Update(int vf,int ls,int ld,int poz,int val){
 if (ls==ld) v[vf]=val;
        else
  {int mij=(ls+ld)/2;
   if (poz<=mij) Update(2*vf,ls,mij,poz,val);
            else Update(2*vf+1,mij+1,ld,poz,val);
   v[vf]=max(v[2*vf],v[2*vf+1]);}
}
void Query(int vf,int ls,int ld,int a,int b){
      if (a<=ls && ld<=b){
                if (maxim<v[vf]) maxim=v[vf];
                         }
                     else
      {int mij=(ls+ld)/2;
       if (a<=mij) Query(2*vf,ls,mij,a,b);
       if (mij<b) Query(2*vf+1,mij+1,ld,a,b);}
}
int main(){
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d %d",&n,&m);
    for (i=1;i<=n;i++) {scanf("%d",&x);
                        Update(1,1,n,i,x);}
    while (m--){
          scanf("%d %d %d",&x,&a,&b);
          if (x==1) Update(1,1,n,a,b);
               else {maxim=-1;
                     Query(1,1,n,a,b);
                     printf("%d\n",maxim);}
               }
    return 0;
}