Cod sursa(job #921947)

Utilizator cernat.catallinFMI Cernat Catalin Stefan cernat.catallin Data 21 martie 2013 20:44:17
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.05 kb
#include <stdio.h>
using namespace std;

#define Nmax 15005

int n, m;
int aib[Nmax];

inline int nrZ(int x){ // returneaza 2 al puterea celui mai nesemnificativ bit de 1
    return ( (x&(x-1))^x );
}

inline void update(int ind, int val, int sign){
    while(ind <= n){
        aib[ind] += (val*sign);
        ind += nrZ(ind);
    }
}

void read(){
    int x;
    scanf("%i %i", &n, &m);
    for(int i = 1; i <= n; ++i){
        scanf("%i", &x);
        update(i, x, 1);
    }
}

inline int query(int x){ // returneaza suma elementelor din intervalul [1,x];
    int s = 0;

    while(x > 0){
        s += aib[x];
        x -= nrZ(x);
    }

    return s;
}

void solve(){
    int op, a, b;
    for(int i = 1; i <= m; ++i){
        scanf("%i %i %i", &op, &a, &b);

        if(op == 0)
            update(a, b, -1);
        if(op == 1)
            printf("%i\n", query(b) - query(a-1));
    }
}

int main(){
    freopen("datorii.in", "r", stdin);
    freopen("datorii.out", "w", stdout);

    read();
    solve();
}