Cod sursa(job #1685027)

Utilizator tudortarniceruTudor Tarniceru tudortarniceru Data 11 aprilie 2016 14:07:58
Problema Arbori indexati binar Scor 60
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
using namespace std;

ifstream fin("aib.in");
ofstream fout("aib.out");

const int MAXN = 100005;
int n, q;
int v[MAXN];
int a[MAXN];

void insert(int p, int x) {
    for (int i = p; i <= n; i = (i | (i - 1)) + 1) {
        a[i] += x;
    }
}
int get(int p) {
    int s = 0;
    for (int i = p; i >= 1; i = (i & (i - 1))) {
        s += a[i];
    }
    return s;
}
int main() {
    fin >> n >> q;
    for (int i = 1; i <= n; ++i) {
        fin >> v[i];
        insert(i, v[i]);
    }
    for (int i = 1; i <= q; ++i) {
        int tip;
        fin >> tip;
        if (tip == 0) {
            int poz, m;
            fin >> poz >> m;
            insert(poz, m);
        }
        else if (tip == 1) {
            int poz1, poz2;
            fin >> poz1 >> poz2;
            fout << get(poz2) - get(poz1 - 1) << '\n';
        }
        else {
            int s;
            fin >> s;
            int st = 1;
            int dr = n;
            int sol = -1;
            while (st <= dr) {
                int mid = (st + dr) / 2;
                int val = get(mid);
                if (val < s) {
                    st = mid + 1;
                }
                else {
                    dr = mid - 1;
                    if (val == s) {
                        sol = mid;
                    }
                }
            }
            fout << sol << '\n';
        }
    }
    fout.close();
    return 0;
}