Cod sursa(job #1507160)

Utilizator PletoPletosu Cosmin-Andrei Pleto Data 21 octombrie 2015 15:03:24
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.09 kb
#include <fstream>

#define nr_zerouri_la_puterea_2(x) ((x&(x-1))^x)

using namespace std;

ifstream in("datorii.in");
ofstream out("datorii.out");

int N,M,cod,indice,val,AIB[15010];

void citeste()
{
    in>>N>>M;
    for(int i=1;i<=N;i++)
    {
        indice=i;
        in>>val;
        while(indice<=N)
        {
            AIB[indice]+=val;
            indice+=nr_zerouri_la_puterea_2(indice);
        }
    }
}

void achitare()
{
    in>>indice>>val;
    while(indice<=N)
    {
        AIB[indice]-=val;
        indice+=nr_zerouri_la_puterea_2(indice);
    }
}

void interogare()
{
    int a,b;
    in>>a>>b;
    int suma_a=0;
    --a;
    while(a)
    {
        suma_a+=AIB[a];
        a-=nr_zerouri_la_puterea_2(a);
    }
    int suma_b=0;
    while(b)
    {
        suma_b+=AIB[b];
        b-=nr_zerouri_la_puterea_2(b);
    }
    out<<suma_b-suma_a<<'\n';
}

void rezolva()
{
    while(M--)
    {
        in>>cod;
        if(cod) interogare();
        else achitare();
    }
}

int main()
{
    citeste();
    rezolva();
    return 0;
}