Cod sursa(job #759728)

Utilizator Theorytheo .c Theory Data 19 iunie 2012 00:18:00
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include<fstream>
#define nmax 15005
using namespace std;

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

long long  N, start, finish, v[nmax], poz, val;
//in v[x] retinem suma de la [x - 2^nr, x], unde nr = nr de zerouri al lui x

void add(long poz, long val)
{
    int nr  = 0 ;
    while(poz <= N)
    {
        v[poz] +=val;
        while( (poz &(1<<nr)) == 0) nr++;

        poz += (1<<nr); nr++;
    }
}

long sum(long x)
{
    int nr = 0;
    long S = 0;
    while(x)
    {
        S += v[x];
        x &= x - 1;
       // while((x & (1<<nr)) == 0) nr++;

       // x-= (1<<nr);
       // nr++;

    }
    return S;
}


void read()
{
    int nr, k;
    fin>> N >>nr;
    for(int i = 1; i <= N;i++)
        fin>> k, add(i, k);

    for(int i = 1; i <= nr; i++)
    {
        int tip;
        fin >>tip;
        if( tip == 0)
        {
            fin >> poz>> val;
            add(poz, -val);
        }
        if(tip == 1)
        {
            fin>>start >> finish;

            fout<< sum(finish) - sum(start - 1)<<'\n';

        }
    }

}
int main()
{
    read();
    fin.close();
    return 0;
}