Cod sursa(job #2572515)

Utilizator IulianOleniucIulian Oleniuc IulianOleniuc Data 5 martie 2020 13:09:40
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda OJI 2020 Marime 1.41 kb
#include <bits/stdc++.h>
using namespace std;

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

class FenTree {
  private:
    int n;
    vector<int> bit;

  public:
    FenTree(int n) :
        n(n), bit(n + 1) { }

    void update(int pos, int val) {
        for (int i = pos; i <= n; i += i & -i)
            bit[i] += val;
    }

    int query(int pos) {
        int sum = 0;
        for (int i = pos; i >= 1; i -= i & -i)
            sum += bit[i];
        return sum;
    }

    int query(int left, int right) {
        return query(right) - query(left - 1);
    }

    int find(int val) {
        int lo = 0, hi = n + 1;
        while (hi - lo > 1) {
            int md = (lo + hi) / 2;
            if (query(md) < val)
                lo = md;
            else
                hi = md;
        }
        return (1 <= hi && hi <= n && query(hi) == val ? hi : -1);
    }
};

int main() {
    int n, q; fin >> n >> q;
    FenTree bit(n);
    for (int i = 1; i <= n; i++) {
        int x; fin >> x;
        bit.update(i, x);
    }

    for (int i = 0; i < q; i++) {
        int t; fin >> t;
        if (!t) {
            int x, y; fin >> x >> y;
            bit.update(x, y);
        }
        else if (t == 1) {
            int x, y; fin >> x >> y;
            fout << bit.query(x, y) << '\n';
        }
        else {
            int x; fin >> x;
            fout << bit.find(x) << '\n';
        }
    }

    fout.close();
    return 0;
}