Pagini recente » Cod sursa (job #2645530) | Cod sursa (job #2856592) | Cod sursa (job #1001006) | Cod sursa (job #2011551) | Cod sursa (job #2921714)
#include <bits/stdc++.h>
using namespace std;
ifstream fin ("rmq.in");
ofstream fout ("rmq.out");
const int MAXN = 100001;
const int LOGMAXN = 17;
int mat[MAXN][LOGMAXN], a[MAXN], n, m;
void citire(int & n, int & m, int a[])
{
fin >> n >> m;
for(int i = 0; i < n; i++)
fin >> a[i];
}
void generare_matrice(int M[][LOGMAXN], int A[], int N)
{
for (int i = 0; i < N; i++)
M[i][0] = i;
//M[i][j] is the index of the minimum value in the sub array starting at i having length 2^j
for (int j = 1; 1 << j <= N; j++)
{
const int cN = N - (1 << j);
for (int i = 0; i <= cN; i++)
if (A[ M[i][j - 1] ] < A[ M[i + (1 << (j - 1))][j - 1] ])
M[i][j] = M[i][j - 1];
else
M[i][j] = M[i + (1 << (j - 1))][j - 1];
}
}
int main()
{
citire(n, m, a);
generare_matrice(mat, a, n);
for(int i = 1; i <= m; i++)
{
int st, dr;
fin >> st >> dr;
int maxpower = (int)log2(dr-st+1);
fout << min(a[ mat[st-1][maxpower] ], a[ mat[dr - (1 << maxpower)][maxpower] ]) << '\n';
}
return 0;
}