Pagini recente » Cod sursa (job #1844243) | Cod sursa (job #1344267) | Cod sursa (job #1881533) | Cod sursa (job #1578151) | Cod sursa (job #1367091)
#include <cstdio>
using namespace std;
const int N=100005;
int aib[N],n;
void update(int poz,int val)
{
do
{
aib[poz]=aib[poz]+val;
poz+=poz&(-poz);
}while(poz<=n);
}
int sum(int poz)
{
int s=0;
while(poz>=1)
{
s=s+aib[poz];
poz&=poz-1;
}
return s;
}
int cauta(int val)
{
int pas=1<<16,p=0;
while(pas>n)
pas=pas/2;
while(pas>0)
{
if(aib[p+pas]<=val && aib[p+pas]!=0)
{
p=p+pas;
val=val-aib[p];
}
pas=pas/2;
}
if(val==0)
return p;
else
return -1;
}
int main()
{
FILE *in,*out;
in=fopen("aib.in","r");
out=fopen("aib.out","w");
int m,i,j,val,c,a,b,ras;
fscanf(in,"%d%d",&n,&m);
for(i=1;i<=n;i++)
{
fscanf(in,"%d",&val);
update(i,val);
}
for(i=1;i<=m;i++)
{
fscanf(in,"%d%d",&c,&a);
if(c==0)
{
fscanf(in,"%d",&val);
update(a,val);
}
if(c==1)
{
fscanf(in,"%d",&b);
ras=sum(b)-sum(a-1);
fprintf(out,"%d\n",ras);
}
if(c==2)
{
ras=cauta(a);
fprintf(out,"%d\n",ras);
}
}
return 0;
}