Cod sursa(job #852974)

Utilizator enedumitruene dumitru enedumitru Data 11 ianuarie 2013 22:51:54
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.38 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;
const int Nmax=15002;
ifstream f("datorii.in"); ofstream g("datorii.out");
int n, m;
ll b[Nmax], c[Nmax];
int main()
{   f>>n>>m;
    for(int i = 1; i <= n; ++i)
    {
         f>>b[i]; b[i] += b[i-1];
         c[i]=b[i]-b[i-zeros(i)];
    }
    int cod, ind, val, st, dr, 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
                poz=0;
                while(ind <= n)
                {
                    c[ind] -= val;
                    ind += zeros(ind);
                    ++poz;
                }
            }
    }
    g.close();
    return 0;
}