Cod sursa(job #177688)

Utilizator GagosGagos Radu Vasile Gagos Data 13 aprilie 2008 14:55:50
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<stdio.h>   
long a[265150],st[265150],dr[265150],n,m,x,y,z,zero=1,fs,fd,tata;   
long query(long p);   
int main()   
{   
    long i;   
    freopen("arbint.in","r",stdin);   
    freopen("arbint.out","w",stdout);   
    scanf("%ld %ld",&n,&m);   
    while(zero<n)   
        zero<<=1;   
    zero--;   
    for(i=zero+1;i<=zero+n;++i){   
        st[i]=i-zero;   
        dr[i]=i-zero;   
        scanf("%ld",&a[i]);   
    }   
    for(i=n+1;i<=zero+1;++i){   
        st[zero+i]=i;   
        dr[zero+i]=i;   
    }   
    for(i=zero;i>=1;--i){   
        fs=i<<1;   
        fd=fs|1;   
        st[i]=st[fs];   
        dr[i]=dr[fd];   
        a[i]=(a[fs]>a[fd])?a[fs]:a[fd];   
    }   
    for(;m;m--){   
        scanf("%ld %ld %ld",&x,&y,&z);   
        if(!x)   
            printf("%ld\n",query(1));   
        else{   
            a[zero+y]=z;   
            tata=(zero+y)>>1;   
            do{   
                a[tata]=(a[tata<<1]>a[(tata<<1)|1])?a[tata<<1]:a[(tata<<1)|1];   
                tata>>=1;   
            }while(tata);   
        }   
    }   
    fcloseall();   
    return 0;   
}   
long query(long p)   
{   
    long m1,m2;   
    if(y>dr[p])   
        return 0;   
    if(z<st[p])   
        return 0;   
    if(y<=st[p] && z>=dr[p])   
        return a[p];   
    m1=query(p<<1);   
    m2=query((p<<1)|1);   
    m1=(m1>m2)?m1:m2;   
    return m1;   
}