Cod sursa(job #144849)

Utilizator vanila_CPPIonescu Victor Cristian vanila_CPP Data 28 februarie 2008 01:35:52
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.62 kb
#include <iostream>
#include <string>
#define FIN "datorii.in"
#define FOUT "datorii.out"
#define MAX_N 15000
using namespace std;
int n,m;
int v[4*MAX_N+66],sum;


void add(int,int,int,int,int);
void query(int,int,int,int,int);


void iofile(void){
        freopen(FIN,"rt",stdin);
        freopen(FOUT,"wt",stdout);
        scanf("%d%d",&n,&m);
        for (int i=1,x;i<=n;i++){
                scanf("%d",&x);
                add(1,1,n,i,x);
        }
}



void solve(void){
        for (int i=1,t,a,b;i<=m;i++){
                scanf("%d%d%d",&t,&a,&b);
                if (t){
                        sum=0;
                        query(1,1,n,a,b);
                        printf("%d\n",sum);
                } else{
                        add(1,1,n,a,-b);
                }
        }
        fclose(stdout);
}

int main(void){
        iofile();
        solve();
        return 0;
}


void add(int nod,int p,int u,int poz,int s){
        v[nod]+=s;
        if (p<u){
                int m=(p+u)/2;
                if (poz<=m){
                        add(2*nod,p,m,poz,s);
                } else {
                        add(2*nod+1,m+1,u,poz,s);
                }
        }
}


void query(int nod,int p,int u,int a,int b){
        if (a<=p && u<=b){
                sum+=v[nod];} else {
                        int m=(p+u)/2;
                        if (a<=m){
                                query(nod*2,p,m,a,b);
                        }
                        if (b>m){
                                query(nod*2+1,m+1,u,a,b);
                        }
                }
}