Pagini recente » Cod sursa (job #2515003) | Cod sursa (job #1906665) | Cod sursa (job #2656628) | Cod sursa (job #1944035) | Cod sursa (job #2608389)
#include <cstdio>
#define zeros(x) ((x ^ (x-1)) & x)
int n, aib[300000];
void update(int x, int y) {
for(int i = x; i <= n; i += zeros(i))
aib[i] += y;
}
int query(int x) {
int s = 0;
for(int i = x; i >= 1; i -= zeros(i))
s += aib[i];
return s;
}
int cb(int x) {
int st = 1, dr = n, m, temp;
while(st <= dr) {
m = (st + dr) >> 1;
temp = query(m);
if(temp == x)
return m;
else if(temp > x)
dr = m - 1;
else
st = m + 1;
}
return -1;
}
int main() {
int m, c, x, y, i;
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
scanf("%d%d", &n, &m);
for(i = 1; i <= n; ++i) {
scanf("%d", &x);
update(i, x);
}
for(i = 1; i <= m; ++i) {
scanf("%d%d", &c, &x);
if(c == 0) {
scanf("%d", &y);
update(x, y);
}
if(c == 1) {
scanf("%d", &y);
printf("%d\n", query(y) - query(x - 1));
}
else if(c == 2)
printf("%d\n", cb(x));
}
}