Cod sursa(job #1799184)

Utilizator giotoPopescu Ioan gioto Data 5 noiembrie 2016 21:27:54
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <cstdio>
#define NARB 100002
using namespace std;

int tip, n, m, x, pos, Sol, a, b, Arb[NARB];
inline void Update(int st, int dr, int nod){
    if(st == dr){Arb[nod] += x; return ;}
    int mid = (st + dr) / 2;
    if(pos <= mid) Update(st, mid, 2 * nod);
    else           Update(mid + 1, dr, 2 * nod + 1);
    Arb[nod] = Arb[nod * 2 + 1] + Arb[nod * 2];
}
inline void Query(int st, int dr, int nod){
    if(a <= st && dr <= b){Sol += Arb[nod]; return ;}
    int mid = (st + dr) / 2;
    if(a <= mid) Query(st, mid, 2 * nod);
    if(mid < b) Query(mid + 1, dr, 2 * nod + 1);
}
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", &x);
        if(x == 0) continue ;
        pos = i;
        Update(1, n, 1);
    }
    for(int i = 1; i <= m ; ++i){
        scanf("%d%d%d", &tip, &pos, &x);
        if(tip == 0){
            x = -x;
            Update(1, n, 1);
            continue ;
        }
        a = pos; b = x;
        Sol = 0;
        Query(1, n, 1);
        printf("%d\n", Sol);
    }
    return 0;
}