Cod sursa(job #855595)

Utilizator mazaandreiAndrei Mazareanu mazaandrei Data 15 ianuarie 2013 11:40:26
Problema Datorii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 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;
}