Cod sursa(job #1955384)

Utilizator FlorinHajaFlorin Gabriel Haja FlorinHaja Data 5 aprilie 2017 22:23:10
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <fstream>

using namespace std;

ifstream f("aib.in");
ofstream g("aib.out");

int arb[100005];
int n, m, t, x, y, i;

void update(int i, int x) {
    while (i <= n) {
        arb[i] += x;
        i += (i&-i);
    }
}

int query(int i) {
    int suma = 0;
    while (i) {
        suma+=arb[i];
        i -= (i&-i);
    }
    return suma;
}

int main() {
    f >> n >> m;
    for (i = 1; i <= n; i++) {
        f >> x;
        update(i,x);
    }
    for (i = 1; i <= m; i++) {
        f >> t;
        if (t==0) {
            f >> x >> y;
            update(x,y);
        } else if (t == 1) {
            f >> x >> y;
            g << query(y) - query(x-1) << '\n';
        } else {
            f >> x;

            int p = 1, j = 0;
            bool ok = 0;
            while (p < n) p *= 2;
            for (;p;p/=2) {
                if (j+p>n)continue;
                y = query(j+p);
                if (y == x) {
                    ok = 1;
                    g<<j+p<<'\n';
                    break;
                } else if (y<x) j+=p;
            }
            y = query(j);
            if (ok==0) g << "-1\n";
        }


    }

    return 0;
}