Pagini recente » Cod sursa (job #3147820) | Cod sursa (job #1033854) | Cod sursa (job #1141365) | Cod sursa (job #689410) | Cod sursa (job #1361980)
#include <fstream>
using namespace std;
#define fileIn "aib.in"
#define fileOut "aib.out"
#define maxN 100005
#define maxM 150005
short arb[maxN * 2];
int pos, val;
void update( int lo, int hi, int node )
{
if ( lo >= hi )
{
arb[node] += val;
return;
}
int mid = ( lo + hi ) >> 1;
if ( pos <= mid )
update( lo, mid, node << 1 );
else
update( mid + 1, hi, ( node << 1 ) + 1 );
arb[node] = arb[node << 1] + arb[ ( node << 1 ) + 1 ];
}
int pos1, pos2, maxS;
void query( int lo, int hi, int node )
{
if ( ( lo >= pos1 ) && ( hi <= pos2 ) )
{
maxS += arb[node];
return;
}
int mid = ( lo + hi ) >> 1;
if ( pos1 <= mid )
query( lo, mid, node << 1 );
if ( pos2 > mid )
query( mid + 1, hi, ( node << 1 ) + 1 );
}
int main()
{
ifstream sIn( fileIn );
ofstream sOut( fileOut );
int n, m, i;
int p;
sIn >> n >> m;
for ( i = 1; i <= n; ++i )
{
pos = i;
sIn >> val;
update( 1, n, 1 );
}
for ( i = 1; i <= m; ++i )
{
sIn >> p;
switch ( p )
{
case 0:
{
sIn >> pos >> val;
update( 1, n, 1 );
break;
}
case 1:
{
sIn >> pos1 >> pos2;
maxS = 0;
query( 1, n, 1 );
sOut << maxS << '\n';
break;
}
case 2:
{
sIn >> p;
pos1 = 1;
for ( pos2 = 1; pos2 <= n; ++pos2 )
{
maxS = 0;
query( 1, n, 1 );
if ( maxS == p )
{
sOut << pos2 << '\n';
break;
}
}
if ( pos2 == n + 1 )
sOut << "-1" << '\n';
break;
}
}
}
return 0;
}