Cod sursa(job #1130409)

Utilizator TheShadowsAlexandru Cristian TheShadows Data 28 februarie 2014 13:08:54
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.11 kb
#include<cstdio>
using namespace std;
const int LIMN = 15010;
int v[LIMN], sum[LIMN], n, m;
int detK(int x){
    int k=0, c=1;
    while((c&x) == 0){
        k++; c=c<<1;
    }
    return k;
}
int bruteSum(int a, int b){
    int s=0;
    for(int i=a; i<=b; i++){
        s+=v[i];
    }
    return s;
}
void createAIB(){
    for(int i=1; i<=n; i++){
        sum[i]=bruteSum(i-(1<<detK(i))+1, i);
    }
}
void add(int pos, int x){
    int i=pos;
    while(i<=n){
        sum[i]-=x;
        i+=1<<detK(i);
    }
}
int getSumStart(int a){
    int i=a, s=0;
    while(i>0){
        s+=sum[i];
        i-=1<<detK(i);
    }

    return s;
}
int query(int a, int b){
    return getSumStart(b) - getSumStart(a-1);
}
FILE *in=fopen("datorii.in","r"), *out=fopen("datorii.out","w");
int main (){
    fscanf(in, "%d%d", &n, &m);
    for(int i=1; i<=n; i++){
        fscanf(in, "%d", &v[i]);
    }
    createAIB();

    int oper, a, b;
    for(int i=1; i<=m; i++){
        fscanf(in, "%d%d%d", &oper, &a, &b);
        if(oper==0){
            add(a, b);
        }else{
            fprintf(out, "%d\n", query(a, b));
        }
    }

    return 0;
}