Pagini recente » Cod sursa (job #1689006) | Cod sursa (job #749986) | Cod sursa (job #2300561) | Cod sursa (job #1828062) | Cod sursa (job #2465962)
#include <bits/stdc++.h>
#define lung(k) (1 << k)
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, v[100005];
int M[100005][20];
int lg[100005];
void FormM()
{
for(int i = 1; i <= n; i++)
M[i][0] = i;
for(int j = 1; lung(j) <= n; j++)
{
for(int i = 1; i + lung(j) - 1 <= n; i++)
{
if(v[M[i][j - 1]] <= v[M[i + lung(j - 1)][j - 1]])
M[i][j] = M[i][j - 1];
else M[i][j] = M[i + lung(j - 1)][j - 1];
}
}
}
void FormLog()
{
int i = 1;
while(i <= n)
{
lg[i]++;
i = i * 2;
}
for(i = 1; i <= n; i++)
{
lg[i] = lg[i - 1] + lg[i];
}
}
int Query(int x, int y)
{
int nivel, raspuns;
int diferenta = y - x + 1;
nivel = lg[diferenta] - 1;
raspuns = min(v[M[x][nivel]] , v[M[y - lung(nivel) + 1][nivel]]);
return raspuns;
}
int main()
{
int x, y, m;
fin >> n >> m;
for(int i = 1; i <= n; i++)
fin >> v[i];
FormM();
FormLog();
for(int i = 1; i <= m; i++)
{
fin >> x >> y;
fout << Query(x, y) << "\n";
}
return 0;
}