Pagini recente » Cod sursa (job #1972171) | Cod sursa (job #2974198) | Cod sursa (job #1725127) | Cod sursa (job #577661) | Cod sursa (job #368443)
Cod sursa(job #368443)
#include<stdio.h>
#define NMAX 100006
int A[NMAX];
int N;
inline int smen( int n )
{
return n^ ( n&(n-1) );
}
void add( int poz,int val )
{
while( poz<=N )
{
A[poz]+=val;
poz+=smen(poz);
}
}
int sum( int poz )
{
int ANS=0;
while( poz )
{
ANS+=A[poz];
poz-=smen(poz);
}
return ANS;
}
int find( int val )
{
int log;
for(log=1; log<N; log<<=1 );
int a1;
int i;
for( i=0; log; log>>=1 )
{
a1=i+log;
if( a1 <= N )
{
if( A[a1] <= val )
{
i=a1;val-=A[a1];
if( !val ) return i;
}
}
}
return -1;
}
int main()
{
freopen("aib.in","r",stdin);
freopen("aib.out","w",stdout);
int M;
scanf("%d%d",&N,&M);
int i,a1,p,val;
for(i=1; i<=N; ++i)
{
scanf("%d",&val);
add( i, val );
}
int v1,v2;int K;
while( M-- )
{
scanf("%d",&a1);
if( !a1 )
{
scanf("%d%d",&p,&val);
add( p, val );
continue;
}
if( a1==1 )
{
scanf("%d%d",&v1,&v2);
printf("%d\n",sum(v2)-sum(v1-1));
continue;
}
if( a1==2 )
{
scanf("%d",&K);
printf("%d\n",find(K));
}
}
return 0;
}