Cod sursa(job #605297)

Utilizator vendettaSalajan Razvan vendetta Data 27 iulie 2011 18:04:57
Problema Datorii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <cstdio>
#include <algorithm>
#define nmax 15001
#define mmax 100001

using namespace std;

int arb[nmax+mmax];
int n, m;

void udpate(int nod, int st, int dr, int poz, int val){
    if (st == dr){
        arb[nod]+=val;
        return;
    }else {
        int mij=(st + dr) / 2;
        if (poz <= mij) udpate(nod*2, st, mij, poz, val);
                   else udpate(nod*2+1, mij+1, dr, poz, val);
    }
    arb[nod]=arb[nod*2] + arb[nod*2+1];
}

int query(int nod, int st, int dr, int a, int b){
    if (st >= a && dr <= b){
        return arb[nod];
    }
    int mij=(st + dr) / 2;
    int s=0;
    if (a<=mij) s+=query(nod*2, st, mij, a, b);
    if (b> mij) s+=query(nod*2+1, mij+1, dr, a, b);
    return s;
}

int main(){
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    scanf("%d %d\n",&n, &m);
    for(int i=1;i<=n;i++){
        int x;
        scanf("%d ", &x);
        udpate(1,1,n,i,x);
    }
    for(int i=1;i<=n;i++) printf("%d ",arb[i]);
    printf("\n");
    for(int i=1;i<=m;i++){
        int tip, x, y;
        scanf("%d %d %d\n", &tip, &x, &y);
        if (tip){
            printf("%d\n",query(1,1,n,x,y));
        }
        if (tip == 0){
            udpate(1,1,n,x,-y);
        }
    }
    return 0;
}