Cod sursa(job #2036108)

Utilizator giotoPopescu Ioan gioto Data 10 octombrie 2017 12:17:43
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <bits/stdc++.h>
using namespace std;

int n, m, a[15005];
int A[100005];
inline void BuildArb(int st, int dr, int nod){
    if(st == dr){A[nod] = a[st]; return ;}
    int mij = (st + dr) / 2;
    BuildArb(st, mij, nod * 2);
    BuildArb(mij + 1, dr, nod * 2 + 1);
    A[nod] = A[nod * 2] + A[nod * 2 + 1];
}
inline void update(int st, int dr, int nod, int z, int v){
    if(st == dr){
        A[nod] -= v;
        return ;
    }
    int mij = (st + dr) / 2;
    if(z <= mij) update(st, mij, nod * 2, z, v);
    else         update(mij + 1, dr, nod * 2 + 1, z, v);
    A[nod] = A[nod * 2] + A[nod * 2 + 1];
}
inline int query(int st, int dr, int nod, int x, int y){
    if(x <= st && dr <= y) return A[nod];
    int mij = (st + dr) / 2, ans = 0;
    if(x <= mij) ans += query(st, mij, nod * 2, x, y);
    if(mij + 1 <= y) ans += query(mij + 1, dr, nod * 2 + 1, x, y);
    return ans;
}
int main()
{
    freopen("datorii.in", "r", stdin);
    freopen("datorii.out", "w", stdout);
    scanf("%d%d", &n, &m);
    for(int i = 1; i <= n ; ++i)
        scanf("%d", &a[i]);
    BuildArb(1, n, 1);
    int x, y, ok;
    for(int i = 1; i <= m ; ++i){
        scanf("%d%d%d", &ok, &x, &y);
        if(ok == 0) update(1, n, 1, x, y);
        else printf("%d\n", query(1, n, 1, x, y));
    }
    return 0;
}