Cod sursa(job #1152147)

Utilizator TarabanDragosTaraban Dragos-Petru TarabanDragos Data 24 martie 2014 16:09:10
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<cstdio>
#include<cstring>
int n,m,op,a,b,v[400100],l,nr,nmax;
char s[2000000];
FILE *f,*g;
int maxim(int a,int b){
        if(a>b)
            return a;
        return b;
}
void ad(int nod,int st,int dr){
    if(st==dr&&st==a){
        v[nod]=b;
        return;
    }
    int mid=((st+dr)>>1);
    if(a<=mid)
        ad((nod<<1),st,mid);
    if(a>mid)
        ad((nod<<1)+1,mid+1,dr);
    v[nod]=maxim(v[(nod<<1)],v[(nod<<1)+1]);
}
void query(int nod,int st,int dr){
    int qs=0,qd=0,mid,nn;
    if(a<=st&&dr<=b){
        nmax=maxim(nmax,v[nod]);
        return;
    }
    mid=((st+dr)>>1);
    if(a<=mid)
        query((nod<<1),st,mid);
    if(mid<b)
        query((nod<<1)+1,mid+1,dr);
 //   if(qs>qd)
  //      return qs;
   // else
     //   return qd;
}
int main(){
    f=fopen("arbint.in","r");
    g=fopen("arbint.out","w");
    fscanf(f,"%d%d\n",&n,&m);
   /* for(i=1;i<=2*n;i++){
        v[i]=-2000000000;
    }*/
    register int i;
   /*fgets(s,5000000,f);
    l=strlen(s);
    nr=0;
    for(i=0;i<l;i++){
        if(s[i]>='0'&&s[i]<='9')
            b=b*10+s[i]-'0';
        else{
            nr++;
            a=nr;
            ad(1,1,n);
            b=0;
        }
    }*/
   for(i=1;i<=n;i++){
        fscanf(f,"%d",&a);
        b=a;
        a=i;
        ad(1,1,n);
    }
    for(i=1;i<=m;i++){
        fscanf(f,"%d%d%d",&op,&a,&b);
        if(op==1){
            ad(1,1,n);
        }
        else{
            nmax=0;
            query(1,1,n);
            fprintf(g,"%d\n",nmax);
        }
    }










    fclose(f);
    fclose(g);
    return 0;
}