Cod sursa(job #1228814)

Utilizator mucenic_b101Bogdan Mucenic mucenic_b101 Data 15 septembrie 2014 16:47:37
Problema Arbori indexati binar Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <iostream>
#include <fstream>

#define MAXN 100000
#define LOG 16
using namespace std;

int aib[MAXN+1];
int n;

void update(int poz, int val) {
    while (poz <= n) {
        aib[poz] += val;
        poz += (poz & (-poz));
    }
}

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

int search(int a) {
    int poz = 0, pas = 1 << LOG;
    while (pas) {
        int p = poz + pas;
        if (p <= n && query(p) < a)
            poz = p;
        pas >>= 1;
    }

    if (query(poz) == a)
        return poz;

    if (poz < n && query(poz + 1) == a)
        return poz + 1;

    return -1;
}


int main () {
    ifstream cin("aib.in");
    ofstream cout("aib.out");

    int m;
    cin >> n >> m;

    for (int i = 0 ; i < n ; ++i) {
        int x;
        cin >> x;
        update(i + 1, x);
    }

    for (int i = 0 ; i < m ; ++i) {
        int tip, a, b;
        cin >> tip;
        switch(tip) {
            case 0:
                cin >> a >> b;
                update(a, b);
                break;
            case 1:
                cin >> a >> b;
                cout << query(b) - query(a - 1) << "\n";
                break;
            case 2:
                cin >> a;
                cout << search(a) << "\n";
                break;
        }
    }

    cin.close();
    cout.close();
    return 0;
}