Pagini recente » Cod sursa (job #863502) | Cod sursa (job #1913248) | Cod sursa (job #1980714) | Cod sursa (job #2559318) | Cod sursa (job #429561)
Cod sursa(job #429561)
#include <cstdio>
FILE *in,*out;
int aib[100005],n;
int bit (int x)
{
return (x&(x-1))^x;
}
void update(int poz,int val)
{
for (;poz<=n;poz+=bit(poz))
aib[poz]+=val;
}
int query1(int poz)
{
int rez=0;
for (;poz>0;poz-=bit(poz))
rez+=aib[poz];
return rez;
}
int query2(int sum)
{
int i,rez=0;
for (i=1;(i<<1)<=n;i<<=1);
for(;i;i>>=1)
{
if (rez+i>n)
continue;
if (aib[rez+i]<=sum)
{
sum-=aib[i+rez];
rez+=i;
}
}
if (sum==0)
return rez;
return -1;
}
int main()
{
int i,x,y,z,m;
in=fopen("aib.in","r");
out=fopen("aib.out","w");
fscanf(in,"%d%d",&n,&m);
for (i=1;i<=n;i++)
{
fscanf(in,"%d",&x);
update(i,x);
}
for (i=1;i<=m;i++)
{
fscanf(in,"%d",&x);
if (x==0)
{
fscanf(in,"%d%d",&y,&z);
update(y,z);
}
if (x==1)
{
fscanf(in,"%d%d",&y,&z);
fprintf(out,"%d\n",query1(z)-query1(y-1));
}
if (x==2)
{
fscanf(in,"%d",&y);
fprintf(out,"%d\n",query2(y));
}
}
fclose(in);
fclose(out);
return 0;
}