Pagini recente » Cod sursa (job #1327095) | Istoria paginii runda/simulare_cerc_hatz/clasament | Cod sursa (job #900977) | Cod sursa (job #1467500) | Cod sursa (job #2575514)
#include <bits/stdc++.h>
#define lung(x) (1 << (x))
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int a[100005];
int lg2[100005];
int RMQ[20][100005];
int K, n, m;
void GenLog()
{
for(int i = 1; (1 << i) <= n; i++)
lg2[(1<<i)] = 1;
for(int i = 1; i <= n; i++)
{
lg2[i] = lg2[i - 1] + lg2[i];
}
K = lg2[n];
}
void GenRmq()
{
for(int i = 1; i <= n; i++)
RMQ[0][i] = a[i];
for(int k = 1; k <= K; k++)
{
for(int i = 1; i <= n; i++)
RMQ[k][i] = min(RMQ[k - 1][i], RMQ[k - 1][i + lung(k - 1)]);
}
for(int i = 0; i <= K; i++)
{
for(int j = 1; j <= n; j++)
cout << RMQ[i][j] << " ";
cout << "\n";
}
}
int Query(int left, int right)
{
int k = lg2[right - left];
return min(RMQ[k][left], RMQ[k][right - lung(k) + 1]);
}
int main()
{
int x, y;
fin >> n >> m;
for(int i = 1; i <= n; i++)
fin >> a[i];
GenLog();
GenRmq();
for(int i = 1; i <= m; i++)
{
fin >> x >> y;
fout << Query(x, y) << "\n";
}
return 0;
}