Pagini recente » Cod sursa (job #2680155) | Cod sursa (job #1735644) | Cod sursa (job #2638121) | Cod sursa (job #199179) | Cod sursa (job #1427721)
#include <stdio.h>
int bin[100001], N;
int remove (int k) {
return k & (k - 1);
}
int zeros (int x) {
return ( x ^ (x - 1)) & x;
}
int ask (int k) {
int Ans = 0;
for (int i = k; i > 0; i -= zeros(i))
Ans += bin[i];
return Ans;
}
void Add (int pos, int val) {
for (int i = pos; i <= N; i += zeros(i))
bin[i] += val;
}
int caut (int target) {
int l = 1, r = N, m, s;
while (l <= r) {
m = (l + r) >> 1;
s = ask (m);
if (s == target)
return m;
if (s < target)
l = m + 1;
else r = m - 1;
}
return -1;
}
int main(int argc, const char * argv[]) {
freopen ("aib.in", "r", stdin);
freopen ("aib.out", "w", stdout);
int T,x;
scanf("%d%d",&N,&T);
for (int i=1; i <= N; ++ i) {
scanf("%d",&x);
Add (i, x);
}
while (T -- ) {
scanf("%d",&x);
switch (x) {
case 0 : {
int a,b;
scanf("%d%d",&a,&b);
Add(a,b);
break;
}
case 1: {
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",ask(b) - ask(a - 1));
break;
}
default : {
scanf("%d",&x);
printf("%d\n",caut(x));
}
}
}
return 0;
}