Cod sursa(job #1645744)

Utilizator serbanSlincu Serban serban Data 10 martie 2016 13:35:08
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.98 kb
#include <fstream>
#define zero(x) ((x ^ (x - 1)) & x)

using namespace std;

int val, n;
int h[100005];

void add(int poz) {
    for(; poz <= n; poz += zero(poz))
        h[poz] += val;
}

int calc(int poz) {
    int ret = 0;
    for(; poz; poz -= zero(poz))
        ret += h[poz];
    return ret;
}

int main()
{
    ifstream f("aib.in");
    ofstream g("aib.out");
    int m, a, b, op; f >> n >> m;
    for(int i = 1; i <= n; i ++) f >> val, add(i);
    for(; m; m --) {
        f >> op;
        if(op == 0) f >> a >> val, add(a);
        else if(op == 1) f >> a >> b, g << calc(b) - calc(a - 1) << "\n";
        else {
            f >> val;
            int l = 1, d = n + 1, mid;
            for(; l < d;) {
                mid = (l + d) / 2;
                if(calc(mid) > val) d = mid;
                else l = mid + 1;
            }
            if(calc(l - 1) != val) g << "-1\n";
            else g << l - 1 << "\n";
        }
    }
    return 0;
}