Cod sursa(job #2946394)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 24 noiembrie 2022 20:09:51
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.38 kb
#include <bits/stdc++.h>
#define LIM 1<<17
/// TONI BO$$ was here
/// #MLC

using namespace std;

int aint[50001];

void update(int st, int dr, int cur, int x, int v){
    if(st == dr){
        aint[cur] += v;
        return ;
    }
    int mid = (st + dr) / 2;
    if(mid >= x)
        update(st, mid, cur * 2, x, v);
    else
        update(mid + 1, dr, cur * 2 + 1, x, v);
    aint[cur] = aint[cur * 2] + aint[cur * 2 + 1];
}

/// interogatiile se fac pe intervalul [1...x] , cu alte cuvinte vrem sa vedem cate elemente exista (nemarcate) in intervalul [1...x]
int query(int st, int dr, int cur, int a, int b){
    if(st == dr)
        return aint[cur];
    if(st >= a && dr <= b)
        return aint[cur];
    int mid = (st + dr) / 2, sol = 0;
    if(mid >= a)
        sol += query(st, mid, cur * 2, a, b);
    if(mid + 1 <= b)
        sol += query(mid + 1, dr, cur * 2 + 1, a, b);
    return sol;
}
int v[15001];
int main()
{
    int n, k, i, q, a,  b;
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    scanf("%d%d", &n, &k);
    for(i = 1; i <= n; i++){
        scanf("%d", &v[i]);
        update(1, n, 1, i, v[i]);
    }
    while(k--){
        scanf("%d%d%d", &q, &a, &b);
        if(q == 0)
            update(1, n, 1, a, -b);
        else
            printf("%d\n", query(1, n, 1, a, b));
    }

    return 0;
}