Pagini recente » Cod sursa (job #1538771) | Cod sursa (job #1788422) | Cod sursa (job #291001) | Cod sursa (job #2553854) | Cod sursa (job #288754)
Cod sursa(job #288754)
#include<stdio.h>
#define Nmax 100000
int aib[Nmax],i,j,k,l,m,n,x,y;
void upd(int poz,int val){
int k=0;
while(poz<=n)
{aib[poz]+=val;
while(!(poz&(1<<k)))k++;
poz+=1<<k;
k+=1;
}
}
int querry(int poz){
int k=0,sum=0;
while(poz>0)
{sum+=aib[poz];
while(!(poz&(1<<k)))k++;
poz-=1<<k;
k++;
}
return sum;
}
int Search(int val)
{
int i, step;
for ( step = 1; step < n; step <<= 1 );
for( i = 0; step; step >>= 1 )
{
if( i + step <= n)
{
if( val >= aib[i+step] )
{
i += step, val -= aib[i];
if ( !val ) return i;
}
}
}
return -1;
}
int main(){
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
scanf("%d %d",&n,&m);
for(i=1;i<=n;i++){
scanf("%d",&x);
upd(i,x);}
for(i=1;i<=m;i++)
{scanf("%d",&k);
if(k==0)
{scanf("%d %d",&x,&y);
upd(x,y);
}
else
if(k==1)
{scanf("%d %d",&x,&y);
printf("%d\n",querry(y)-querry(x-1));
}
else
{scanf("%d",&x);
printf("%d\n",Search(x));
}
}
return 0;}