Pagini recente » Cod sursa (job #1833992) | Cod sursa (job #2408978) | Cod sursa (job #1989923) | Cod sursa (job #1503908) | Cod sursa (job #2759743)
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream in("aib.in");
ofstream out("aib.out");
int n, m, arbore[100001], k, x, y;
void actualizare(int pos, int val) {
int aux = 0;
while (pos <= n) {
arbore[pos] += val;
while (!(pos & (1 << aux)))
++aux;
pos += (1 << aux);
++aux;
}
}
int query(int pos) {
int aux = 0, aux2 = 0;
while (pos > 0) {
aux2 += arbore[pos];
while (!(pos & (1 << aux)))
++aux;
pos -= (1 << aux);
++aux;
}
return aux2;
}
int cauta(int val) {
int aux = 1;
while (aux < n)
aux <<= 1;
for (int i = 0; aux; aux >>= 1)
if (i + aux <= n && val >= arbore[i + aux]) {
i += aux;
val -= arbore[i];
if (!val)
return i;
}
return -1;
}
int main() {
in >> n >> m;
for (int i = 1; i <= n; ++i) {
in >> x;
actualizare(i, x);
}
while (m--) {
in >> k;
if (k < 2) {
in >> x >> y;
if (!k)
actualizare(x, y);
else
out << query(y) - query(x - 1) << '\n';
} else {
in >> x;
out << cauta(x) << '\n';
}
}
return 0;
}