Pagini recente » Cod sursa (job #2786611) | Cod sursa (job #419306) | Cod sursa (job #2250953) | Cod sursa (job #2635010) | Cod sursa (job #2202907)
#include<cstdio>
#define aib_SIZE 100000
using namespace std;
int aib[aib_SIZE+1], n, m;
inline void updateAIB(int pos, int x) {
do {
aib[pos] += x;
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 x) {
int left, right, mid, pos, suma;
left = 1;
right = n;
pos = -1;
while(left <= right && pos == -1) {
mid = (left + right) >> 1;
suma = sum(mid);
if(x == suma)
pos = mid;
else if(x < suma)
right = mid - 1;
else left = mid + 1;
}
return pos;
}
int main() {
int x, op, y, i;
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(i,x);
}
for(i = 1; i <= m; i++) {
fscanf(fin,"%d%d",&op,&x);
if(op < 2)
fscanf(fin,"%d",&y);
if(op == 0)
updateAIB(x,y);
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;
}