Pagini recente » Cod sursa (job #2985593) | Cod sursa (job #3139526) | Cod sursa (job #603401) | Cod sursa (job #3140934) | Cod sursa (job #550508)
Cod sursa(job #550508)
#include<stdio.h>
int aib[101010],N,M;
int tip,x,y;
int zero(int x)
{
return (x^(x-1))&x;
}
int add(int poz,int x)
{
for(int i=poz;i<=N;i+=zero(i))
aib[i]+=x;
}
int querry(int poz)
{
int S=0;
for(int i=poz;i>=1;i-=zero(i))
S+=aib[i];
return S;
}
int search(int val)
{
int poz;
for(poz=1;poz<N;poz=poz*2);
for(int i=0;poz;poz=poz/2)
{
if(i+poz<=N)
{
if(aib[i+poz]<=val)
{
i+=poz,val-=aib[i];
if(val==0)
return i;
}
}
}
return -1;
}
int main()
{
freopen("aib.in","r",stdin);
froepen("aib.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i=1;i<=N;++i)
{
scanf("%d",&x);
add(i,x);
}
for(int i=1;i<=M;++i)
{
scanf("%d",&tip);
if(tip==0)
{
scanf("%d%d",&x,&y);
add(x,y);
}
else if(tip==1)
{scanf("%d%d",&x,&y);
printf("%d\n",querry(y)-querry(x-1));
}
else
{
scanf("%d",&x);
printf("%d\n",search(x));
}
}
}