Pagini recente » Cod sursa (job #1899349) | Cod sursa (job #97841) | Cod sursa (job #3282997) | Cod sursa (job #1065172) | Cod sursa (job #174137)
Cod sursa(job #174137)
#include <stdio.h>
long n,m,arb[100001],k,a,b;
void update(long pos,long val)
{
long c=0;
while (pos<=n)
{
arb[pos]+=val;
while (!(pos&1<<c))
c++;
pos+=1<<c;
c++;
}
}
long query(long pos)
{
long s=0,c=0;
while (pos>0)
{
s+=arb[pos];
while (!(pos&1<<c))
c++;
pos-=1<<c;
c++;
}
return s;
}
long search(long val)
{
long c=1,i=0;
while (c<n)
c<<=1;
while (c)
{
if (val>=arb[i+c])
{
i+=c;
val-=arb[i];
if (!val)
return i;
}
c>>=1;
}
return -1;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%ld %ld\n",&n,&m);
long i,x;
for (i=1;i<=n;i++)
{
scanf ("%ld",&x);
update(i,x);
}
for (i=0;i<m;i++)
{
scanf ("%ld",&k);
switch (k)
{
case 0:scanf("%ld %ld\n",&a,&b); update(a,b);break;
case 1:scanf("%ld %ld\n",&a,&b); printf("%ld\n",query(b)-query(a-1));break;
case 2:scanf("%ld\n",&a); printf("%ld\n",search(a));break;
}
}
return 0;
}