Pagini recente » Cod sursa (job #1647053) | Cod sursa (job #2956115) | Cod sursa (job #1240548) | Cod sursa (job #1384592) | Cod sursa (job #210643)
Cod sursa(job #210643)
#include<stdio.h>
long n,a[100000],m,i,q,x,aa,b;
void pune(long p,long x)
{long y;
y=0;
while(p<=n)
{a[p]+=x;
while(!(p&(1<<y)))
++y;
p+=(1<<y);++y;}
}
long suma(long p)
{long y,z;
y=0;z=0;
while(p>0)
{z+=a[p];
while(!(p&(1<<y)))
++y;
p-=(1<<y);++y;}
return z;
}
long cauta(long x)
{
long i,j,ii;
for(i=1;i<n;i<<=1);
for(j=0;i;i>>=1)
if(j+i<=n)
if(x>=a[i+j])
{j+=i,x-=a[j];if(x==0)return i;}
return -1;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%ld%ld",&n,&m);
for(i=1;i<=n;++i){scanf("%ld",&q);pune(i,q);}
for(i=1;i<=m;++i)
{scanf("%ld%ld",&x,&aa);
if(x<=1)
{scanf("%ld",&b);
if(x==1)printf("%ld\n",(suma(b)-suma(aa-1)));
else pune(aa,b);
}
else
printf("%ld\n",cauta(aa));
}
return 0;
}