Pagini recente » Cod sursa (job #2484219) | Cod sursa (job #307095) | Cod sursa (job #2408071) | Cod sursa (job #2710546) | Cod sursa (job #1335614)
#include <stdio.h>
#include <fstream>
using namespace std;
int aib[100001];
void upd(int n,int poz,int val)
{
int c=0;
while(poz<n)
{
aib[poz]+=val;
while((poz&(1<<c))==0)
++c;
poz+=(1<<c);
++c;
}
}
int fpoz(int val)
{
int c=0,i=1;
while(i<n)
i*=2;
while(i>0)
{
if(val>=aib[c+i])
{
c+=i;
val-=aib[c];
if(val==0)
return c;
}
i/=2;
}
return -1;
}
int q(int poz)
{
int c=0,s=0;
while(poz>0)
{
s+=aib[poz];
while((poz&(1<<c))==0)
++c;
poz-=c;
++c;
}
return s;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int n,m;
scanf("%i %i",&n,&m);
int i,a;
for(i=0;i<n;++i)
{
scanf("%i",&a);
upd(n,i+1,a);
}
int k,x,y;
for(;m>0;m--)
{
scanf("%d",&k);
if(k<2)
{
scanf("%d%d",&x,&y);
if(k==0)
upd(n,x,y);
else
printf("%d\n",q(y)-q(x-1));
}
else
{
scanf("%d",&x);
printf("%d\n",fpoz(x,n));
}
}
}