Cod sursa(job #1090966)

Utilizator manutrutaEmanuel Truta manutruta Data 23 ianuarie 2014 12:50:36
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
using namespace std;

#define MAXN 100005
#define zero(x) (x ^ (x - 1) & x)

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

int n;
int aib[MAXN];

void update(int ind, int val)
{
    while (ind <= n) {
        aib[ind] += val;
        ind += zero(ind);
    }
}

int query(int ind)
{
    int s = 0;
    while (ind > 0) {
        s += aib[ind];
        ind -= zero(ind);
    }
    return s;
}

int search(int sum)
{
    int st = 1, dr = n;
    while (st <= dr) {
        int mij = (st + dr) / 2;
        int nr = query(mij);
        if (nr == sum) {
            return mij;
        }

        if (nr < sum) {
            st = mij + 1;
        } else {
            dr = mij - 1;
        }
    }
    return -1;
}

int main()
{
    int m;
    f >> n >> m;
    int s = 0;
    for (int i = 1; i <= n; i++) {
        int x;
        f >> x;
        update(i, x);
        s += x;
    }

    for (int i = 1; i <= m; i++) {
        int op, a, b;
        f >> op >> a;

        switch(op) {
        case 0:
            f >> b;
            update(a, b);
            break;
        case 1:
            f >> b;
            g << query(b) - query(a - 1) << '\n';
            break;
        case 2:
            g << search(a) << '\n';
        }
    }

    return 0;
}