Pagini recente » Cod sursa (job #1378662) | Istoria paginii utilizator/adela_petre | Cod sursa (job #2370099) | Cod sursa (job #434274) | Cod sursa (job #903149)
Cod sursa(job #903149)
#include <cstdio>
#include <algorithm>
using namespace std;
#define MN 100002
#define zeros(x) x&-x
#define MaxStep 1<<17
int AIB[MN];
int N;
void Add(int pos, int val)
{
for (int i = pos; i <= N; i += zeros(i))
AIB[i] += val;
}
int Compute(int pos)
{
int ret = 0;
for (int i = pos; i > 0; i -= zeros(i))
ret += AIB[i];
return ret;
}
int Search(int val)
{
long i,step,t;
for ( step = 1; step < N; step <<= 1 );
for(i=0;step>0;step>>=1)
{
if(i+step<=N && Compute(i+step)>=val)
i+=step;
}
if(Compute(i)==val) return i;
return -1;
}
int main()
{
freopen("aib.in", "r", stdin);
freopen("aib.out", "w", stdout);
int m,type,x,y;
scanf("%d%d",&N,&m);
for(int i=1;i<=N;++i)
{
scanf("%d",&x);
Add(i,x);
}
while(m--)
{
scanf("%d",&type);
if(type==0)
{
scanf("%d%d",&x,&y);
Add(x,y);
}
else if(type==1)
{
scanf("%d%d",&x,&y);
printf("%d\n",Compute(y)-Compute(x-1));
}
else
{
scanf("%d",&x);
printf("%d\n",Search(x));
}
}
return 0;
}