Pagini recente » Cod sursa (job #1473874) | Cod sursa (job #1301704) | Cod sursa (job #2838340) | Cod sursa (job #935555) | Cod sursa (job #2863854)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
int n, m, a[100003];
int rmq[21][100003], p2[100003];
/**p2[i] = lungimea putere a lui 2 maxima a unui interval care
are lungimea i
rmq[i][j] = pozitia minimului din intervalul[j, j + 2 ^ i - 1]
i = 0, 1, ...k, unde 2 ^ k <= p
*/
void RMQ()
{
int i, j, len;
p2[1] = 0;
for (i = 2; i <= n; i++)
p2[i] = 1 + p2[i / 2];
for (i = 1; i <= n; i++)
rmq[0][i] = i;
for(i = 1; (1 << i) <= n; i++)
for (j = 1; j <= n - (1 << i) + 1; j++)
{
len = (1 << i) - 1;
rmq[i][j] = rmq[i - 1][j];
if (a[rmq[i - 1][j]] > a[rmq[i - 1][j + len]])
rmq[i][j] = rmq[i - 1][j + len];
}
}
void Citire()
{
int i, x, y, expo, len, sol1, sol2;
fin >> n >> m;
for (i = 1; i <= n; i++)
fin >> a[i];
RMQ();
for (i = 1; i <= m; i++)
{
fin >> x >> y;
if (x > y) swap(x, y);
expo = p2[y - x + 1];
len = (1 << expo);
sol1 = rmq[expo][x];
sol2 = rmq[expo][y - len + 1];
if (a[sol1] > a[sol2]) fout << a[sol2] << "\n";
else fout << a[sol1] << "\n";
}
}
int main()
{
Citire();
fout.close();
return 0;
}