Cod sursa(job #195902)

Utilizator toni2007Pripoae Teodor Anton toni2007 Data 23 iunie 2008 11:29:22
Problema Arbori de intervale Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.3 kb
#include <stdio.h>
#include <stdlib.h>
#define N 100010
int n,m;
int v[N];
int arb[5*N];
int val,pos,start,finish,maxim;
int max(int a,int b){
    if (a>b)
       return a;
    return b;
}
void update(int i,int l,int r){
     int div;
     if (l==r){
        arb[i]=val;
        return;
     }
     div=(l+r)/2;
     if (pos<=div)  update(2*i,l,div);
     else           update(2*i+1,div+1,r);
     arb[i]=max(arb[2*i],arb[2*i+1]);
}
void querry(int i,int l,int r){
     int div;
     if (start<=l && r<=finish){
        if (maxim<arb[i])
           maxim=arb[i];
        return;
     }
     div=(l+r)/2;
     if (start<=div)querry(2*i,l,div);
     if (div<finish)querry(2*i+1,div+1,r);
}
int main(void){
    int i,a,b,x;
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    scanf("%d%d",&n,&m);
    for (i=1;i<=n;++i){
        scanf("%d",&x);
        pos=i;
        val=x;
        update(1,1,n);
    }
    while (m--){
          scanf("%d%d%d",&x,&a,&b);
          if (x==0){
             maxim=-1;
             start=a;
             finish=b;
             querry(1,1,n);
             printf("%d\n",maxim);
          }
          else{
               pos=a;
               val=b;
               update(1,1,n);
          }
    }
    return 0;
}