Pagini recente » Cod sursa (job #1198454) | Cod sursa (job #1218737) | Cod sursa (job #28155) | Cod sursa (job #2348342) | Cod sursa (job #733351)
Cod sursa(job #733351)
#include <fstream>
using namespace std;
ifstream fin("aib.in");
ofstream fout("aib.out");
#define MAXN 100100
int arb[MAXN], n, m;
int query(int k) {
int sum = 0;
while(k > 0) {
sum += arb[k];
k = k - (k & (-k));
}
return sum;
}
void update(int k, int add) {
while(k <= n) {
arb[k] += add;
k = k + (k & (-k));
}
}
int search(int sum) {
int rez, step;
for (step = 1; step <= n; step *= 2);
for (rez = 0; step; step /= 2) {
if (rez + step <= n)
if (sum >= arb[rez + step]) {
rez += step;
sum -= arb[rez];
if (sum == 0) return rez;
}
}
return -1;
}
int main() {
int i, a, op, b, add;
fin >> n >> m;
for (i = 1; i <= n; ++i) {
fin >> a;
update(i, a);
}
for (i = 1; i <= m; ++i) {
fin >> op;
switch (op) {
case 0: {
fin >> a >> add;
update(a, add);
break;
}
case 1: {
fin >> a >> b;
fout << query(b) - query(a - 1) << "\n";
break;
}
case 2: {
fin >> a;
fout << search(a) << "\n";
break;
}
}
}
fout.close();
return 0;
}