Pagini recente » Cod sursa (job #2839951) | Cod sursa (job #194715) | Cod sursa (job #3178025) | Cod sursa (job #2126925) | Cod sursa (job #1479484)
#include <iostream>
#include <fstream>
using namespace std;
const int Nmax = 100005;
int N, M;
int BIT[Nmax];
inline int bit( int x )
{
return ( x & ( -x ) );
}
void update( int pos, int val )
{
while ( pos <= N )
{
BIT[pos] += val;
pos += bit( pos );
}
}
int sum( int lim )
{
int s = 0;
while ( lim > 0 )
{
s += BIT[lim];
lim -= bit( lim );
}
return s;
}
int bin_search( int s )
{
int step, i = 0;
for ( step = 1; step < N; step <<= 1 );
for ( ; step; step >>= 1 )
{
if ( i + step <= N )
{
if ( s >= BIT[i + step] )
{
i += step;
s -= BIT[i];
if ( s == 0 )
return i;
}
}
}
return -1;
}
int main()
{
ifstream f("aib.in");
ofstream g("aib.out");
f >> N >> M;
for ( int i = 1, val; i <= N; ++i )
{
f >> val;
update( i, val );
}
for ( int i = 1, tip, val1, val2; i <= M; ++i )
{
f >> tip;
switch ( tip )
{
case 0:
f >> val1 >> val2;
update( val1, val2 );
break;
case 1:
f >> val1 >> val2;
g << sum( val2 ) - sum( val1 - 1 ) << "\n";
break;
case 2:
f >> val1;
g << bin_search( val1 ) << "\n";
break;
}
}
f.close();
g.close();
return 0;
}