Pagini recente » Cod sursa (job #236095) | Cod sursa (job #2348945) | Cod sursa (job #3246181) | Cod sursa (job #2279656) | Cod sursa (job #2753150)
#include <fstream>
std::ifstream in("aib.in");
std::ofstream out("aib.out");
const int N = 1e5 + 1;
const int L = 16;
int n;
struct Aib {
int data[N];
void update(int p, int val);
int query(int p);
int exact_value_min_idx(int val);
} aib;
void Aib::update(int p, int val) {
while (p <= n) {
data[p] += val;
p += p & (-p);
}
}
int Aib::query(int p) {
int ret = 0;
while (p) {
ret += data[p];
p -= p & (-p);
}
return ret;
}
int Aib::exact_value_min_idx(int val) {
int r = 0, step = 1 << 16;
while (step) {
if (r + step <= n && aib.data[r + step] <= val) {
r += step;
val -= aib.data[r];
}
step >>= 1;
}
return !val && r ? r : -1;
}
int main() {
in >> n;
int m;
in >> m;
for (int i = 1; i <= n; ++i) {
int x;
in >> x;
aib.update(i, x);
}
for (int i = 0; i < m; ++i) {
int op, a, b;
in >> op;
switch (op) {
case 0:
in >> a >> b;
aib.update(a, b);
break;
case 1:
in >> a >> b;
out << aib.query(b) - aib.query(a - 1) << '\n';
break;
case 2:
in >> a;
out << aib.exact_value_min_idx(a) << '\n';
}
}
}