Pagini recente » Cod sursa (job #514526) | Cod sursa (job #481389) | Cod sursa (job #2277483) | Cod sursa (job #2186404) | Cod sursa (job #1584473)
#include <fstream>
#define lsb(x) x & (-1 * x)
using namespace std;
int aib[100005];
void update(int x, int val);
int querry(int x); /// querry 1 -> x
int cbin(int a);
int main()
{
ifstream in("aib.in");
ofstream out("aib.out");
int n, k, op, a, b;
in >> n >> k;
for (int i = 1; i <= n; i++) {
in >> a;
update(i, a);
}
while (k--) {
in >> op >> a;
if (op == 2) {
int poz = cbin(a);
if (querry(poz) != a)
out << -1 << '\n';
else
out << poz << '\n';
}
else {
in >> b;
if (op == 0) {
update(a, b);
}
else
out << querry(b) - querry(a - 1) << '\n';
}
}
return 0;
}
int cbin(int a) {
int p = 0, q = 1 << 17;
while (q > 0) {
if (p + q <= 100000 && querry(p + q) < a)
p += q;
q /= 2;
}
return p + 1;
}
int querry(int x) {
int r = 0;
while (x > 0) {
r += aib[x];
x -= lsb(x);
}
return r;
}
void update(int x, int val) {
while (x <= 100000) {
aib[x] += val;
x += lsb(x);
}
}