Pagini recente » Cod sursa (job #1792275) | Cod sursa (job #1612545) | Cod sursa (job #1076249) | Cod sursa (job #2150192) | Cod sursa (job #1120348)
#include<cstdio>
using namespace std;
const int nmax = 100005;
int n,m,i,x,aib[nmax],op,a,b;
void update(int poz,int val)
{
for(int i=poz;i<=n;i+=i&(-i)) aib[i]+=val;
}
int sum(int poz)
{
int r=0;
for(int i=poz;i;i-=i&(-i)) r+=aib[i];
return r;
}
int query(int x)
{
int r=0,step,y=x;
for(step=1;step<=n;step<<=1);
for(;step;step>>=1)
if(r+step<=n && aib[r+step]<x) {r+=step; x-=aib[r];}
if(sum(++r)==y) return r;
else return -1;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%d",&x);
update(i,x);
}
for(;m;m--)
{
scanf("%d",&op);
if(op==0)
{
scanf("%d%d",&a,&b);
update(a,b);
}
else if(op==1)
{
scanf("%d%d",&a,&b);
printf("%d\n",sum(b)-sum(a-1));
}
else
{
scanf("%d",&a);
printf("%d\n",query(a));
}
}
return 0;
}