Cod sursa(job #1336310)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 7 februarie 2015 16:39:15
Problema Distincte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.26 kb
#include <fstream>
#include <cstring>
#define DIM 100005
#define bit(x) ((x&(x-1))^x)

using namespace std;

ifstream fin("baruri.in");
ofstream fout("baruri.out");

int N,AIB[DIM],M,T;
void add(int x,int val){
    for(int i=x;i<=N;i+=bit(i))
        AIB[i]+=val;
}
int suma(int x){
    int sum=0;
    for(int i=x;i>0;i-=bit(i))
        sum+=AIB[i];
    return sum;
}
int main(){
    fin>>T;
    while(T--){
        fin>>N;
        memset(AIB,0,sizeof(AIB));
        for(int i=1;i<=N;i++){
            int x;
            fin>>x;
            add(i,x);
        }
        fin>>M;
        while(M--){
            int op,a,b,c;
            fin>>op;
            if(op==0){
                fin>>a>>b;
                int S=0;
                S+=suma(max(a-1,0))-suma(max(a-b-1,0));
                S+=suma(min(a+b,N))-suma(min(a,N));
                fout<<S<<"\n";
            }
            if(op==1){
                fin>>a>>b;
                add(b,a);
            }
            if(op==2){
                fin>>a>>b;
                add(b,-a);
            }
            if(op==3){
                fin>>a>>b>>c;
                add(b,-a);
                add(c,a);
            }
        }
    }
    fin.close();fout.close();
    return 0;
}