Cod sursa(job #1489811)

Utilizator DeltaMTP Dragos DeltaM Data 22 septembrie 2015 02:55:46
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.13 kb
#include<cstdio>
int n,m,i,j,q,a,b,s,v[100100];
FILE *f,*g;
int maxim(int a,int b){
    if(a>b)
        return a;
    return b;
}
void upd(int nod,int l,int r,int p,int x){
    if(l==r){
        v[nod]=x;
        return;
    }
    int mid=(l+r)>>1;
    if(p<=mid)
        upd( (nod<<1), l, mid, p, x );
    else
        upd( (nod<<1)+1, mid+1, r, p, x );
    v[nod]=maxim( v[ (nod<<1) ], v[ (nod<<1)+1 ] );
}
void query(int nod,int l,int r,int a,int b){
    if(a<=l&&r<=b){
        s=maxim(s,v[nod]);
        return;
    }
    int mid=(l+r)>>1;
    if(a<=mid)
        query( (nod<<1), l, mid, a, b );
    if(b>mid)
        query( (nod<<1)+1, mid+1, r, a, b );
}
int main(){
    f=fopen("arbint.in","r");
    g=fopen("arbint.out","w");
    fscanf(f,"%d%d",&n,&m);
    for(i=1;i<=n;i++){
        fscanf(f,"%d",&a);
        upd(1,1,n,i,a);
    }
    for(i=1;i<=m;i++){
        fscanf(f,"%d%d%d",&q,&a,&b);
        if(q==1)
            upd(1,1,n,a,b);
        if(q==0){
            s=0;
            query(1,1,n,a,b);
            fprintf(g,"%d\n",s);
        }
    }
    fclose(f);
    fclose(g);
    return 0;
}