Cod sursa(job #852939)

Utilizator enedumitruene dumitru enedumitru Data 11 ianuarie 2013 22:13:26
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
// arbore indexat binar
#include<fstream>
#define ll long long
using namespace std;
const int Nmax=15002;
ifstream f("datorii.in"); ofstream g("datorii.out");
int n, m;
int mk[17];
ll b[Nmax], c[Nmax];
inline int valk(int a)
{
    int v=0,p=1;
    while((a & mk[v]) == 0) v++, p <<= 1;
    return p;
}
int main()
{   f>>n>>m;
    int nr=0, x=n;
    while(x) mk[nr]=(1<<nr), nr++, x >>= 1;
    for(int i = 1; i <= n; ++i)
    {
         f>>b[i]; b[i] += b[i-1];
         c[i]=b[i]-b[i-valk(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];
                    while( (dr & mk[poz]) == 0) ++poz;
                    dr -= mk[poz];
                    ++poz;
                }
                --st;
                ll s2=0; poz=0;
                while(st)
                {
                    s2 += c[st];
                    while( (st & mk[poz]) == 0) ++poz;
                    st -= mk[poz];
                    ++poz;
                }
                g<<s1-s2<<'\n';
            }
        else
            {
                f>>ind>>val; // modificare
                poz=0;
                while(ind <= n)
                {
                    c[ind] -= val;
                    while((ind & mk[poz]) == 0) ++poz;
                    ind += mk[poz];
                    ++poz;
                }
            }
    }
    g.close();
    return 0;
}