Pagini recente » Borderou de evaluare (job #633590) | Cod sursa (job #2618427)
#include <stdio.h>
#define log(x) 31-__builtin_clz(x)
#define N 100000
int n, aib[N+1], com;
void update (int i, int x) {
for (; i<=n; i+=i&(-i))
aib[i]+=x;
}
int query (int i) {
int ans=0;
for (; i; i-=i&(-i))
ans+=aib[i];
return ans;
}
int cautbin (int x) {
int st=1, dr=n, mid, val;
while (st<=dr) {
mid=st+((dr-st)>>1);
val=query(mid);
if (x > val)
st=mid+1;
else
if (x < val)
dr=mid-1;
else
return mid;
}
return -1;
}
int main () {
FILE *fin=fopen("aib.in", "r"),
*fout=fopen("aib.out", "w");
int m, i, x, y;
fscanf(fin, "%d%d", &n, &m);
com=n;
if (com&(com-1))
com=1<<log(com)+1;
for (i=1; i<=n; ++i) {
fscanf(fin, "%d", &x);
update(i, x);
}
for (; m; --m) {
fscanf(fin, "%d", &i);
switch (i) {
case 0:
fscanf(fin, "%d%d", &x, &y);
update(x, y);
break;
case 1:
fscanf(fin, "%d%d", &x, &y);
fprintf(fout, "%d\n", query(y)-query(x-1));
break;
case 2:
fscanf(fin, "%d", &x);
fprintf(fout, "%d\n", cautbin(x));
break;
}
}
return 0;
}