Pagini recente » Cod sursa (job #1190985) | Cod sursa (job #1544971) | Cod sursa (job #2692379) | Cod sursa (job #2226503) | Cod sursa (job #1499110)
#include <stdio.h>
FILE *fin, *fout;
int a[100023],n,m,t,x,y,z,logn,use;
void update(int p,int v)
{
for(;p<=n;p+=(p&(p^(p-1))))
{
a[p]+=v;
}
}
int query(int p)
{
int s=0;
for(;p>0;p-=(p&(p^(p-1))))
{
s+=a[p];
}
return s;
}
int query2(int s)
{
use=logn;
for(int i=0;use>0;use>>=1)
{
if(i+use<=n)
{
if(s>=a[i+use])
{
i+=use;
s-=a[i];
if(s==0)
{
return i;
}
}
}
}
return -1;
}
int main()
{
fin=fopen("aib.in","r");
fout=fopen("aib.out","w");
fscanf(fin,"%d %d",&n,&m);
logn=1;
while(logn<=n)
{
logn<<=1;
}
logn>>=1;
for(int i=1;i<=n;i++)
{
fscanf(fin,"%d",&t);
update(i,t);
}
for(int i=0;i<m;i++)
{
fscanf(fin,"%d",&x);
if(x==0)
{
fscanf(fin,"%d%d",&y,&z);
update(y,z);
}
else if(x==1)
{
fscanf(fin,"%d%d",&y,&z);
fprintf(fout,"%d\n",query(z)-query(y-1));
}
else
{
fscanf(fin,"%d",&y);
fprintf(fout,"%d\n",query2(y));
}
}
}