Cod sursa(job #853972)

Utilizator enedumitruene dumitru enedumitru Data 12 ianuarie 2013 17:03:21
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
// arbore indexat binar
#include<fstream>
#define ll long long
#define zeros(x) ( (x ^ (x - 1)) & x )  //doi la puterea numarul de zero-uri terminale din reprezentarea binara a lui x
using namespace std;
ifstream f("datorii.in"); ofstream g("datorii.out");
int n, m;
ll c[15002];
int main()
{   f>>n>>m;
    int cod, ind, val, st, dr, poz;
    for(int i = 1; i <= n; ++i)
    {
        f>>val; ind=i; // modificare prin adunare
        poz=0;
        while(ind <= n)
            {
                c[ind] += val;
                ind += zeros(ind);
                ++poz;
            }
    }
    while(m--)
    {
        f>>cod;
        if(cod)
            {
                f>>st>>dr; // interogare;
                ll s1=0; poz=0;
                while(dr)
                {
                    s1 += c[dr];
                    dr -= zeros(dr);
                    ++poz;
                }
                --st;
                ll s2=0; poz=0;
                while(st)
                {
                    s2 += c[st];
                    st -= zeros(st);
                    ++poz;
                }
                g<<s1-s2<<'\n';
            }
        else
            {
                f>>ind>>val; // modificare prin scadere
                poz=0;
                while(ind <= n)
                {
                    c[ind] -= val;
                    ind += zeros(ind);
                    ++poz;
                }
            }
    }
    g.close();
    return 0;
}