Cod sursa(job #2866534)

Utilizator radu.Radu Cristi radu. Data 9 martie 2022 19:33:25
Problema Arbori indexati binar Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.22 kb
#include <iostream>
#include <fstream>
#define NMAX 100005
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
int N, M;
long s[NMAX];
int update(long poz, long val) {
    for (int i = poz; i <= N; i += (i & -i)) {
        s[i] += val;
    }
}
int query(long poz) {
    long sum = 0;
    for (int i = poz; i > 0; i -= (i & -i)) {
        sum += s[i];
    }
    return sum;
}
void read() {
    fin >> N >> M;
    int nr;
    for (int i = 1; i <= N; ++i) {
        fin >> nr;
        update(i, nr);
    }
}
int findK(long sum) {
    int left = 1, right = N, mid;
    while (left <= right) {
        mid = (left + right) / 2;
        if (query(mid) >= sum) {
            right = mid - 1;
        }
        else {
            left = mid + 1;
        }
    }
    if (query(left) == sum)
        return left;
    return -1;
}
int main()
{
    read();
    int t;
    long a, b;
    for (int i = 0; i < M; ++i) {
        fin >> t;
        if (t == 0) {
            fin >> a >> b;
            update(a, b);
        }
        else if (t == 1) {
            fin >> a >> b;
            fout << query(b) - query(a - 1) << "\n";
        }
        else {
            fin >> a;
            fout << findK(a) << "\n";
        }
    }
    return 0;
}