Pagini recente » Cod sursa (job #991122) | Cod sursa (job #3127756) | Cod sursa (job #234687) | Cod sursa (job #2320296) | Cod sursa (job #1988697)
#include<cstdio>
#define aibSIZE 100000
using namespace std;
int aib[aibSIZE+1], n, m;
inline void updateAIB(int val, int x)
{
do
{
aib[x] += val;
x += x & (-x);
}while(x <= n);
}
inline int sum(int x)
{
int s = 0;
while(x)
{
s += aib[x];
x &= x-1;
}
return s;
}
inline int BSearch(int val)
{
int left, right, mid, pos, x;
left = 1; right = n;
pos = -1;
while(left <= right && pos == -1)
{
mid = left + (right-left)/2;
x = sum(mid);
if(x == val)
pos = mid;
else if(x > val)
right = mid - 1;
else left = mid + 1;
}
return pos;
}
int main()
{
int i, x, y, op;
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",&op);
if(!op)
{
fscanf(fin,"%d%d",&x,&y);
updateAIB(y,x);
}
else if(op == 1)
{
fscanf(fin,"%d%d",&x,&y);
fprintf(fout,"%d\n",sum(y) - sum(x-1));
}
else
{
fscanf(fin,"%d",&x);
fprintf(fout,"%d\n",BSearch(x));
}
}
fclose(fin);
fclose(fout);
return 0;
}