Cod sursa(job #2392164)

Utilizator MarianConstantinMarian Constantin MarianConstantin Data 29 martie 2019 18:55:08
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>

using namespace std;

const int MAXN = 1e6;

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

int tree[MAXN + 10], n, m;

void add(int ind, int val) {
    for (int i = ind; i <= n; i += (i & (-i)))
        tree[i] += val;
}

int sum(int ind) {
    int s = 0;
    for (int i = ind; i >= 1; i -= (i & (-i)))
        s += tree[i];
    return s;
}

int find(int val) {
    int start, power;
    for (power = 1; power < n; power <<= 1);
    for (start = 0; power; power >>= 1)
        if (start + power <= n) {
            if (tree[start + power] <= val) {
                start += power;
                val -= tree[start];
                if (!val)
                return (start);
            }
        }
    return -1;
}

int main() {
    int p, x, y;;
    fin >> n >> m;
    for (int i = 1; i <= n; ++i) {
        fin >> x;
        add(i, x);
    }
    for (int i = 1; i <= m; ++i) {
        fin >> p;
        if (p == 0) {
            fin >> x >> y;
            add(x, y);
        }
        else if (p == 1) {
            fin >> x >> y;
            fout << sum(y) - sum(x - 1) << "\n";
        }
        else {
            fin >> x;
            fout << find(x) << "\n";
        }
    }
    return 0;
}