Cod sursa(job #2604485)

Utilizator MocalinnoMoca Andrei Catalin Mocalinno Data 22 aprilie 2020 18:57:39
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <bits/stdc++.h>
#define DAU  ios::sync_with_stdio(false); fin.tie(0); fout.tie(0);
#define PLEC fin.close(); fout.close(); return 0;
using namespace std;
const string problem("aib");
ifstream fin(problem + ".in");
ofstream fout(problem + ".out");
class AIB {
public:
    AIB() {}
    AIB(int _n) :
        n(_n), aib(vector<int>(_n + 1)) {}
    inline void Update(int pos, int val) {
        for (int i = pos; i <= n; i += i & -i)
            aib[i] += val;
    }
    inline int Query(int pos) {
        int sum(0);
        for (int i = pos; i >= 1; i -= i & -i)
            sum += aib[i];
        return sum;
    }
    inline int Search(int val) {
        int st(1), dr(n), mid, curr;
        while (st <= dr) {
            mid = (st + dr) / 2;
            curr = Query(mid);
            if (curr == val)
                return mid;
            if (curr < val)
                st = mid + 1;
            else dr = mid - 1;
        }
        return -1;
    }
private:
    vector<int> aib;
    int n;
};
int n, q, op, a, b;
int main() {
    DAU
    fin >> n >> q;
    AIB aib(n);
    for (int i = 1; i <= n; ++i) {
        fin >> a;
        aib.Update(i, a);
    }
    while (q--) {
        fin >> op >> a;
        if (op == 2)
            fout << aib.Search(a) << '\n';
        else {
            fin >> b;
            if (op == 1)
                fout << aib.Query(b) - aib.Query(a - 1) << '\n';
            else aib.Update(a, b);
        }
    }
    PLEC
}