Cod sursa(job #2866437)

Utilizator lucamLuca Mazilescu lucam Data 9 martie 2022 18:22:38
Problema Arbori indexati binar Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>
using namespace std;

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

const int N = 1e5 + 1;

inline int g(int x) {
    return x - (x & -x);
}

inline int h(int x) {
    return x + (x & -x);
}

inline int flog2(int x) {
    return (x != 0) * (31 - __builtin_clz(x));
}

int n;
int v[N];
namespace fwt {
    void add(int idx, int delta) {
        for (int i = idx; i <= n; i = h(i)) {
            v[i] += delta;
        }
    }
    int prefix_sum(int idx) {
        int rs = 0;
        while (idx > 0) {
            rs += v[idx];
            idx = g(idx);
        }
        return rs;
    }
    inline int sum(int l, int r) {
        return prefix_sum(r) - prefix_sum(l - 1);
    }
    int op2(int s) {
        int idx = 0;
        int step = 1 << flog2(n);
        while (step > 0 && s > 0) {
            if (idx + step <= n && v[idx + step] <= s) {
                idx += step;
                s -= v[idx];
            }
            step >>= 1;
        }
        return (s == 0 && idx != 0) ? idx : -1;
    }
};

int main() {
    int m;
    in >> n >> m;
    for (int i = 1; i <= n; ++i) {
        int x;
        in >> x;
        fwt::add(i, x);
    }
    while (m--) {
        int op;
        in >> op;
        int a, b;
        switch (op) {
        case 0:
            in >> a >> b;
            fwt::add(a, b);
            break;
        case 1:
            in >> a >> b;
            out << fwt::sum(a, b) << '\n';
            break;
        case 2:
            in >> a;
            out << fwt::op2(a) << '\n';
        }
    }
}