Pagini recente » Cod sursa (job #45777) | Cod sursa (job #2163289) | Cod sursa (job #871693) | Cod sursa (job #653110) | Cod sursa (job #1361976)
#include <fstream>
using namespace std;
#define fileIn "aib.in"
#define fileOut "aib.out"
#define maxN 100005
#define maxM 150005
int 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 getIndex( int lo, int hi, int node )
{
if ( lo >= hi )
return node;
return getIndex( lo, ( lo + hi ) >> 1, node << 1 );
}
int main()
{
ifstream sIn( fileIn );
ofstream sOut( fileOut );
int n, m, i;
int p, k;
sIn >> n >> m;
for ( i = 1; i <= n; ++i )
{
pos = i;
sIn >> val;
update( 1, n, 1 );
}
int start = getIndex( 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;
maxS = 0;
for ( k = 0; k < n; ++k )
{
maxS += arb[start+k];
if ( maxS == p )
{
sOut << ( k + 1 ) << '\n';
break;
}
}
if ( k == n )
sOut << "-1" << '\n';
break;
}
}
}
return 0;
}