Cod sursa(job #217088)

Utilizator mihaipoascaPoasca Mihai mihaipoasca Data 26 octombrie 2008 21:56:29
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include<stdio.h>

FILE *fin=fopen("datorii.in","r"),
    *fout=fopen("datorii.out","w");

int N,M,A[4*15000];

void add(int b,int e,int i,int nod,int val){
    if(b==e)
        A[nod]+=val;
    else{
        if(i<=(b+e)/2){
            add(b,(b+e)/2,i,nod*2,val);
            A[nod]+=val;
        }
        else{
            add((b+e)/2+1,e,i,nod*2+1,val);
            A[nod]+=val;
        }
    }

}

int ask(int nod,int b,int e,int i,int j){
    int p1,p2;

    if(i>e || j<b)
        return -1;

    if(b>=i&&j>=e)
        return A[nod];

    p1=ask(2*nod,b,(b+e)/2,i,j);
    p2=ask(2*nod+1,(b+e)/2+1,e,i,j);

    if(p1==-1)
        return p2;
    if(p2==-1)
        return p1;
    return p1+p2;
}

int main(){
    fscanf(fin,"%d %d",&N,&M);

    for(int i=1;i<=N;i++){
        int x;
        fscanf(fin,"%d",&x);
        add(1,N,i,1,x);
    }

    for(int i=1;i<=M;i++){
        int c,x,y;
        fscanf(fin,"%d %d %d",&c,&x,&y);
        if(c==0)
            add(1,N,x,1,-y);
        else
            fprintf(fout,"%d\n",ask(1,1,N,x,y));
    }

    fclose(fin);
    fclose(fout);
    return 0;
}