Pagini recente » Cod sursa (job #2119000) | Cod sursa (job #782360)
Cod sursa(job #782360)
#include<cstdio>
using namespace std;
int c[100002],n,i,x,m;
void update(int ind,int val)
{
int k=0;
while(ind<=n)
{
c[ind]+=val;
while(!(ind & 1<<k)) k++;
ind+=(1<<k);
k++;
}
}
int sum(int ind)
{
int s=0,k=0;
while(ind>0)
{
s+=c[ind];
while(!(ind & 1<<k)) k++;
ind-=(1<<k);
k++;
}
return s;
}
int Sum_a(int a)
{
int s=0,k,poz=0;
bool ok=1;
while(ok)
{
k=-1;
ok=0;
while(s+c[poz+(1<<(k+1))]<=a && poz+(1<<(k+1))<=n)
{
k++;
ok=1;
}
if(k!=-1)
{
s+=c[poz+(1<<k)];
poz+=(1<<k);
}
}
if(s==a && a!=0) return poz;
else return -1;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%i %i\n",&n,&m);
int a,beg,end;
for(i=1;i<=n;i++)
c[i]=0;
for(i=1;i<=n;i++)
{
scanf("%i/n",&x);
update(i,x);
}
while(m)
{
scanf("%i\n",&x);
if(x==0)
{
scanf("%i %i\n",&i,&a);
update(i,a);
}
else
if(x==1)
{
scanf("%i %i\n",&beg,&end);
printf("%i\n",sum(end)-sum(beg-1));
}
else
if(x==2)
{
scanf("%i\n",&a);
printf("%i\n",Sum_a(a));
}
m--;
}
return 0;
}