Pagini recente » Cod sursa (job #2277720) | Cod sursa (job #2493376) | Cod sursa (job #853176) | Monitorul de evaluare | Cod sursa (job #2615440)
#include <iostream>
#include <fstream>
#include <cmath>
const int N = 100001;
using namespace std;
ifstream f("rmq.in");
ofstream g("rmq.out");
int main()
{
int n, m, v[N][21], a[N], lg, m1, m2, pow[21];
f >> n >> m;
for(int i=1; i<=n; i++)
{
f>>a[i];
v[i][0] = i;
}
lg = log2(n);
//g << lg;
int p = 1;
int cont=1;
int j = 1;
while( j <= lg)
{
for(int i; i+cont<=n; i++)
if(a[v[i][j-1]] < a[v[i + p][j - 1]])
v[i][j] = v[i][j-1];
else
v[i][j] = v[i + p][j - 1];
p *= 2;
cont += p;
++j;
}
pow[0] = 1;
for(int i = 1; i <= 20; i ++)
pow[i] = 2 * pow[i - 1];
for(int i=1; i<=m; i++)
{
f >> m1 >> m2;
int lungime= m2 - m1 + 1;
lg = log2(lungime);
if(a[v[m1][lg]] < a[v[m1 + lungime - pow[lg]][lg]])
g << a[v[m1][lg]] << '\n';
else
g << a[v[m1 + lungime - pow[lg]][lg]] << '\n';
}
return 0;
}