Pagini recente » Cod sursa (job #781726) | Cod sursa (job #1139622) | Cod sursa (job #649626) | Cod sursa (job #1138490) | Cod sursa (job #2150733)
#include<cstdio>
#define MAX_N 100000
using namespace std;
int aib[MAX_N + 1], n, m;
inline void updateAIB(int val, int pos) {
do {
aib[pos] += val;
pos += pos & (-pos);
}while(pos <= n);
}
inline int sum(int x) {
int suma = 0;
while(x) {
suma += aib[x];
x &= (x-1);
}
return suma;
}
int binarySearch(int val) {
int left, right, mid, suma;
left = 1; right = n;
while(left <= right) {
mid = (left + right) >> 1;
suma = sum(mid);
if(suma == val)
return mid;
else if(val < suma)
right = mid - 1;
else left = mid + 1;
}
return -1;
}
int main() {
int i, x, op, y;
FILE *fin, *fout;
fin = fopen("aib.in","r");
fout = fopen("aib.out","w");
fscanf(fin,"%d%d",&n,&m);
for(i = 1; i <= n; i++) {
fscanf(fin,"%d",&x);
updateAIB(x,i);
}
for(i = 1; i <= m; i++) {
fscanf(fin,"%d%d",&op,&x);
if(op != 2)
fscanf(fin,"%d",&y);
if(op == 0)
updateAIB(y,x);
else if(op == 1)
fprintf(fout,"%d\n",sum(y) - sum(x-1));
else fprintf(fout,"%d\n",binarySearch(x));
}
fclose(fin);
fclose(fout);
return 0;
}