Cod sursa(job #1076677)

Utilizator usermeBogdan Cretu userme Data 10 ianuarie 2014 14:53:12
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.01 kb
#include <cstdio>

FILE*f=fopen("arbint.in","r");
FILE*h=fopen("arbint.out","w");

int t[2<<19];

inline int max(int a,int b){
    if ( a>b )return a;
    return b;
}

inline void update(int p,int st,int dr,int poz,int val){
    if ( st==dr ){t[p]=val;return;}
    int m=(st+dr)/2;
    if ( poz<=m )update(2*p,st,m,poz,val);
    else update(2*p+1,m+1,dr,poz,val);
    t[p]=max(t[2*p],t[2*p+1]);
}

inline int query(int p,int st,int dr,int a,int b){
    if ( a<=st&&dr<=b )return t[p];
    int m=(st+dr)/2;
    int m1=-1,m2=-1;
    if ( a<=m )m1=query(2*p,st,m,a,b);
    if ( m+1<=b )m2=query(2*p+1,m+1,dr,a,b);
    return max(m1,m2);
}

int main()
{
    int n,m;
    fscanf(f,"%d%d",&n,&m);
    for ( int i=1;i<=n;++i ){
        int a;
        fscanf(f,"%d",&a);
        update(1,1,n,i,a);
    }
    for ( int i=1;i<=m;++i ){
        int s,a,b;
        fscanf(f,"%d%d%d",&s,&a,&b);
        if ( s==0 )fprintf(h,"%d\n",query(1,1,n,a,b));
        else update(1,1,n,a,b);
    }
    return 0;
}