Pagini recente » Cod sursa (job #1013551) | Cod sursa (job #3277018) | Cod sursa (job #1557177) | Cod sursa (job #1022231) | Cod sursa (job #2307594)
#include <stdio.h>
#include <stdlib.h>
#define MAXN 100000
#define zeros(x) ((x ^ (x - 1)) & x)
int n;
int aib[MAXN + 1];
inline void add(int position, int value){
for(int i = position; i <= n; i += zeros(i))
aib[i] += value;
}
inline int query(int position){
int ans = 0;
for(int i = position; i > 0; i -= zeros(i))
ans += aib[i];
return ans;
}
inline int binarySearch(int value){
int i, step;
for(step = 1; step < n; step <<= 1);
for(i = 0; step; step >>= 1)
if(i + step <= n && value >= aib[i + step]){
i += step, value -= aib[i];
if(!value) return i;
}
return -1;
}
int main(){
FILE*fi,*fo;
fi=fopen("aib.in","r");
fo=fopen("aib.out","w");
int m, x, t, a, b;
fscanf(fi,"%d%d", &n, &m);
for(int i=1;i<=n;i++){
fscanf(fi,"%d", &x);
add(i, x);
}
for(int i=0;i<m;i++){
fscanf(fi,"%d", &t);
if(t==0){
fscanf(fi,"%d%d", &a, &b);
add(a, b);
}
else if(t==1){
fscanf(fi,"%d%d", &a, &b);
fprintf(fo,"%d\n", query(b)-query(a-1));
}
else{
fscanf(fi,"%d", &a);
fprintf(fo,"%d\n", binarySearch(a));
}
}
fclose(fi);
fclose(fo);
return 0;
}