Cod sursa(job #2243857)

Utilizator andytosaAndrei Tosa andytosa Data 21 septembrie 2018 15:49:33
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.21 kb
#include <fstream>

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

int aib[132000];
int n, m, x, q, a, b;

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

int sum(int pos) {
    if (pos == 0) return 0;

    return aib[pos] + sum(pos - (pos & (-pos)));
}

int findPos(int left, int right, int s) {
    int mij = (left + right) / 2;

    int aux = sum(mij);
    if (aux == s) return mij;
    if (left == right) return -1;

    if (s <= aux) return findPos(left, mij, s);
    else return findPos(mij + 1, right, s);
}

int main()
{
    fin >> n >> m;
    for (int i = 1; i <= n; i++) {
        fin >> x;
        apdate(i, x);
    }

    for (int i = 1; i <= m; i++) {
        fin >> q;
        switch (q) {
            case 0: {
                fin >> a >> b;
                apdate(a, b);
            } break;
            case 1: {
                fin >> a >> b;
                fout << sum(b) - sum(a - 1) << '\n';
            } break;
            case 2: {
                fin >> a;
                fout << findPos(1, n, a) << '\n';
            }
        }
    }
    return 0;
}