Cod sursa(job #1584473)

Utilizator theodor.moroianuTheodor Moroianu theodor.moroianu Data 30 ianuarie 2016 10:12:41
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <fstream>
#define lsb(x) x & (-1 * x)
using namespace std;

int aib[100005];

void update(int x, int val);
int querry(int x); /// querry 1 -> x

int cbin(int a);

int main()
{
    ifstream in("aib.in");
    ofstream out("aib.out");
    int n, k, op, a, b;
    in >> n >> k;
    for (int i = 1; i <= n; i++) {
        in >> a;
        update(i, a);
    }
    while (k--) {
        in >> op >> a;
        if (op == 2) {
            int poz = cbin(a);
            if (querry(poz) != a)
                out << -1 << '\n';
            else
                out << poz << '\n';
        }
        else {
            in >> b;
            if (op == 0) {
                update(a, b);
            }
            else
                out << querry(b) - querry(a - 1) << '\n';
        }
    }
    return 0;
}

int cbin(int a) {
    int p = 0, q = 1 << 17;
    while (q > 0) {
        if (p + q <= 100000 && querry(p + q) < a)
            p += q;
        q /= 2;
    }
    return p + 1;
}


int querry(int x) {
    int r = 0;
    while (x > 0) {
        r += aib[x];
        x -= lsb(x);
    }
    return r;
}

void update(int x, int val) {
    while (x <= 100000) {
        aib[x] += val;
        x += lsb(x);
    }
}