Pagini recente » Cod sursa (job #1332597) | Cod sursa (job #930960) | Cod sursa (job #3277106) | Cod sursa (job #2775575) | Cod sursa (job #1839442)
#include <fstream>
#include <cmath>
#include <vector>
#include <iostream>
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int n, m;
vector <int> V;
vector <int> Segm_Tree;
void initialize(int arb_curent, int st, int dr)
{
if (st == dr)
Segm_Tree[arb_curent] = st;
else
{
int m = (st + dr) / 2;
initialize ( 2 * arb_curent, st, m);
initialize ( 2 * arb_curent + 1, m + 1, dr);
if ( V[Segm_Tree[2 * arb_curent]] <= V[Segm_Tree[2 * arb_curent + 1]] )
Segm_Tree[arb_curent] = Segm_Tree[2 * arb_curent];
else
Segm_Tree[arb_curent] = Segm_Tree[2 * arb_curent + 1];
}
}
int query (int arb_curent, int st, int dr, int i, int j)
{
if ( i == st && j == dr )
return Segm_Tree[arb_curent] ;
int m = ( st + dr ) / 2 ;
if ( j <= m )
return query ( 2 * arb_curent, st, m, i, j ) ;
if ( m < i )
return query ( 2 * arb_curent + 1, m + 1, dr, i, j ) ;
int p1 = query ( 2 * arb_curent, st, m, i, m );
int p2 = query( 2 * arb_curent + 1, m + 1, dr, m + 1, j );
if ( V[p1] <= V[p2] )
return p1;
else
return p2;
}
int main()
{
f >> n >> m;
V.resize (n + 1);
for (int i = 1; i <= n; ++i)
f >> V[i];
Segm_Tree.resize( 2 * ( pow (2, log2(n) + 1) ) );
initialize(1, 1, n);
for (int i = 1; i <= m; ++i)
{
int x, y;
f >> x >> y;
g << V[query(1, 1, n, x, y)] << "\n";
}
f.close();
g.close();
return 0;
}