Cod sursa(job #179134)

Utilizator GagosGagos Radu Vasile Gagos Data 15 aprilie 2008 18:09:43
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<stdio.h>      
long a[32800],st[32800],dr[32800],n,m,x,y,z,zero=1,fs,fd,tata;      
long query(long p);      
int main()      
{      
    long i;      
    freopen("datorii.in","r",stdin);      
    freopen("datorii.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];      
    }      
    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];      
                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;      
    return m1;
}