Pagini recente » Cod sursa (job #26503) | Monitorul de evaluare | Cod sursa (job #1940482) | Cod sursa (job #1803889) | Cod sursa (job #2312929)
#include <iostream>
#include <fstream>
#include <math.h>
#define NMAX 100001
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int MMAX = log2 (100001);
int n, m;
int input[NMAX];
int sparse[NMAX][MMAX];
void Construct()
{
for (int i = 0; i < n; i++)
sparse[i][0] = i;
for (int j = 1; (1 << j) <= n; j++)
{
for (int i = 0; i + (1 << j) - 1 < n; i++)
{
if (input[sparse[i][j-1]] < input[sparse[i+(1 << j-1)][j-1]])
sparse[i][j] = sparse[i][j-1];
else
sparse[i][j] = sparse[i+(1 << j-1)][j-1];
}
}
}
int Query(int low,int high)
{
int l = high - low + 1;
int k = log2(k);
return min(input[sparse[low][k]] , input[sparse[low + l - (1 << k)][k]]);
}
int main()
{
fin >> n >> m;
for (int i = 0; i < n; i++)
fin >> input[i];
Construct();
while (m--)
{
int a, b;
fin >> a >> b;
fout << Query(a-1,b-1) << "\n";
}
return 0;
}