Pagini recente » Cod sursa (job #80134) | Cod sursa (job #813427) | Cod sursa (job #2441835) | Cod sursa (job #330320) | Cod sursa (job #563836)
Cod sursa(job #563836)
#include<fstream>
#include<cstdio>
using namespace std;
const int MaxN = 100001;
const char in[] = "aib.in";
const char out[] = "aib.out";
int n,m,Arb[MaxN];
void update(int poz,int val)
{
int p = 0;
while( poz <= n )
{
Arb[poz] += val;
while( !(poz & (1<<p)) )
p++;
poz += (1<<p);
p++;
}
}
int query(int poz)
{
int p = 0, S = 0;
while( poz )
{
S += Arb[poz];
while( !(poz & (1<<p) ) )
p++;
poz -= (1<<p);
p++;
}
return S;
}
int Binary_search(int val)
{
int i,step;
for( step = 1 ; step < n ; step = step << 1 );
for( i = 0 ; step ; step = step >> 1 )
if( i+step <= n )
if( val >= Arb[i+step] )
{
val -= Arb[i+step];
i += step;
if( !val )
return i;
}
return -1;
}
int main()
{
freopen ( in , "r" , stdin );
freopen ( out , "w" , stdout );
scanf("%d%d" , &n , &m );
int i,op,ind,v,st,dr;
for( i = 1 ; i <= n ; i++ )
{
scanf("%d" , &v );
update(i,v);
}
for( i = 1 ; i <= m ; i++ )
{
scanf("%d" , &op);
if( !op )
{
scanf("%d%d" , &ind , & v);
update(ind,v);
}
else
if( op == 1 )
{
scanf ("%d%d" , &st , &dr);
printf("%d\n" , query(dr) - query(st-1) );
}
else
{
scanf("%d" , &v);
printf("%d\n" , Binary_search(v));
}
}
return 0;
}