Cod sursa(job #1076730)

Utilizator usermeBogdan Cretu userme Data 10 ianuarie 2014 15:18:38
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.21 kb
#include <cstdio>

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

int n,m,l,t[1<<20],k;

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)>>1;
    if ( poz<=m )update(p<<1,st,m,poz,val);
    else update((p<<1)+1,m+1,dr,poz,val);
    t[p]=t[p<<1]+t[(p<<1)+1];
}

inline void update2(int p,int st,int dr,int poz,int val){
    if ( st==dr ){t[p]=val;return;}
    int m=(st+dr)>>1;
    if ( poz<=m )update2(p<<1,st,m,poz,val);
    else update2((p<<1)+1,m+1,dr,poz,val);
    t[p]=t[p<<1]+t[(p<<1)+1];
}

inline void query(int p,int st,int dr,int a,int b){
    if ( a<=st&&dr<=b ){k+=t[p];return;};
    int m=(st+dr)>>1;
    if ( a<=m ){query(p<<1,st,m,a,b);}
    if ( m+1<=b ){query((p<<1)+1,m+1,dr,a,b);}
}

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