Cod sursa(job #1895660)

Utilizator danyvsDan Castan danyvs Data 28 februarie 2017 09:35:06
Problema Arbori indexati binar Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>

using namespace std;

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

const int NMAX = 100005;

int n, queries;
int BIT[NMAX];

int getSum(int idx) {
    int sum = 0;
    while (idx > 0) {
        sum += BIT[idx];
        idx -= (idx & -idx);
    }
    return sum;
}

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

int binarySearch(int val) {
    int step, i;
    for (step = 1; step < n; step <<= 1) ;
    for (i = 0; step; step >>= 1)
        if (i + step <= n && BIT[i + step] <= val) {
            i += step;
            val -= BIT[i];
            if (!val)
                return i;
        }
    return -1;
}

int main() {
    fin >> n >> queries;
    for (int i = 0; i < n; ++ i) {
        int temp;
        fin >> temp;
        update(i + 1, temp);
    }
    for (int i = 0; i < queries; ++ i) {
        int task, x, y;
        fin >> task;
        switch(task) {
            case 0:
                fin >> x >> y;
                update(x, y);
                break;
            case 1:
                fin >> x >> y;
                fout << getSum(y) - getSum(x - 1) << "\n";
                break;
            case 2:
               fin >> x;
               fout << binarySearch(x) << "\n";
               break;
            }
    }
    fin.close();
    fout.close();
    return 0;
}