Pagini recente » Cod sursa (job #1941732) | Cod sursa (job #3138965) | Cod sursa (job #2114104) | Cod sursa (job #2188580) | Cod sursa (job #2202544)
#include <stdio.h>
#define zeros(x) (x & -x)
#define MAX 100005
using namespace std;
int n, m, t, x, y;
int aib[MAX];
void update(int pos, int val) {
for (int i = pos; i <= n; i += zeros(i))
aib[i] += val;
}
int query(int pos) {
int sum = 0;
for (int i = pos; i; i -= zeros(i))
sum += aib[i];
return sum;
}
int cb(int x) {
int l = 1, r = n;
int m, sum;
while (l <= r) {
m = (l + r) / 2;
sum = query(m);
if (sum == x)
return m;
if (sum < x)
l = m + 1;
else
r = m - 1;
}
return -1;
}
int main() {
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d%d\n", &n, &m);
for (int i = 1; i <= n; ++i) {
scanf("%d", &x);
update(i, x);
}
for (int i = 0; i < m; ++i) {
scanf("%d%d", &t, &x);
if (t == 0) {
scanf("%d", &y);
update(x, y);
}
else if (t == 1) {
scanf("%d", &y);
printf("%d\n", query(y) - query(x - 1));
}
else
printf("%d\n", cb(x));
}
return 0;
}