Cod sursa(job #3230183)

Utilizator BoggiGurau Bogdan Boggi Data 19 mai 2024 20:01:44
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.43 kb
#include <vector>
#include <fstream>
using namespace std;

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

#define VI vector<int>

int N, M;

VI AIB;

void update(int idx, int val) {
    for (int i = idx; i <= N; i += i & -i) {
        AIB[i] += val;
    }
}

int query(int idx) {
    int sum = 0;
    for (int i = idx; i > 0; i -= i & -i) {
        sum += AIB[i];
    }
    return sum;
}

int sum(int a, int b) {
    return query(b) - query(a - 1);
}

int binSearch(int val) {
    int lft = 1, rgt = N, mid, pos = -1;
    while(lft <= rgt) {
        mid = (lft + rgt) / 2;
        if (query(mid) >= val) {
            pos = mid;
            rgt = mid - 1;
        } else {
            lft = mid + 1;
        }
    }
    if (query(pos) != val) {
        return -1;
    }
    return pos;
}

int main() {
    fin >> N >> M;
    AIB = VI(N + 1, 0);
    for (int i = 1; i <= N; ++i) {
        int val;
        fin >> val;
        update(i, val);
    }

    for (int i = 1; i <= M; ++i) {
        int opp;
        fin >> opp;
        if (opp == 0) {
            int idx, val;
            fin >> idx >> val;
            update(idx, val);
        }
        else if (opp == 1) {
            int a, b;
            fin >> a >> b;
            fout << sum(a, b) << '\n';
        } else {
            int val;
            fin >> val;
            fout << binSearch(val) << '\n';
        }
    }
}