Cod sursa(job #2497708)

Utilizator Vaida_Radu_AndreiVaida Radu Andrei Vaida_Radu_Andrei Data 23 noiembrie 2019 10:23:22
Problema Datorii Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.35 kb
#include <cstdio>
#define nMax 16384

using namespace std;

int getMin2Pow(int x) {
    return (x^(x-1))&x;
}

class Aib {
    public:
        int length;
        int v[nMax];

        Aib();

        void add(int pos,int value);

        int sum(int p);
        int sum(int p1,int p2);
}Money;

Aib::Aib() {
}

void Aib::add(int pos,int value) {
    for(;pos<=length;pos+=getMin2Pow(pos)) {
        v[pos]+=value;
    }
}

int Aib::sum(int p) {
    int sol;
    for(sol=0;p;p-=getMin2Pow(p)) {
        sol+=v[p];
    }
    return sol;
}

int Aib::sum(int p1,int p2) {
    return sum(p2)-sum(p1);
}

void read(int&q) {
    int i,x;
    scanf("%d%d",&Money.length,&q);
    for(i=1;i<=Money.length;++i) {
        scanf("%d",&x);
        Money.add(i,x);
    }
}

void task0() {
    int pos,value;
    scanf("%d%d",&pos,&value);
    Money.add(pos,-value);
}

void task1() {
    int p1,p2;
    scanf("%d%d",&p1,&p2);
    printf("%d\n",Money.sum(p1-1,p2));
}

void solve(const int&q) {
    int iq,task;
    for(iq=0;iq<q;++iq) {
        scanf("%d",&task);
        if(task) {
            task1();
        }
        else {
            task0();
        }
    }
}

int main()
{
    freopen("datorii.in","r",stdin);
    freopen("datorii.out","w",stdout);
    int q;
    read(q);
    solve(q);
    return 0;
}