Pagini recente » Cod sursa (job #267476) | Cod sursa (job #1438474) | Cod sursa (job #2909503) | Cod sursa (job #2920254) | Cod sursa (job #2210530)
#include<cstdio>
#define aibSIZE 100000
using namespace std;
int aib[aibSIZE+1], n, m;
inline void updateAIB(int x, int pos) {
while(pos <= n) {
aib[pos] += x;
pos += pos & (-pos);
}
}
inline int sum(int x) {
int s = 0;
while(x) {
s += aib[x];
x &= (x-1);
}
return s;
}
int binarySearch(int val) {
int b, e, mid, s, pos = -1;
b = 1, e = n;
while(b <= e && pos == -1) {
mid = (b + e) >> 1;
s = sum(mid);
if(s == val)
pos = mid;
else if(val < s)
e = mid - 1;
else b = mid + 1;
}
return pos;
}
int main() {
int i, op, x, 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 = 0; i < m; i++) {
fscanf(fin,"%d%d",&op,&x);
if(op != 2)
fscanf(fin,"%d",&y);
if(!op)
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;
}