Pagini recente » Istoria paginii utilizator/wizardofoz | Cod sursa (job #3360561)
#include <bits/stdc++.h>
using namespace std;
ifstream in ("rmq.in");
ofstream out ("rmq.out");
#define MAX 100005
int n, q;
long long v[MAX];
long long rmq[MAX][20];
long long lg[MAX];
void calc()
{
lg[1] = 0;
for (int i = 2; i <= n; i++)
{
lg[i] = lg[i / 2] + 1;
}
for (int i = 1; i <= n; i++)
{
rmq[i][0] = v[i];
}
for (int j = 1; (1 << j) <= n; j++)
{
for (int i = 1; (i + (1 << j) - 1) <= n; i++)
{
rmq[i][j] = min(rmq[i][j - 1], rmq[i + (1 << (j - 1))][j - 1]);
}
}
}
long long query(int a, int b)
{
int power = lg[b - a + 1];
return min(rmq[a][power], rmq[b - (1 << power) + 1][power]);
}
int main()
{
ios_base::sync_with_stdio(false);
in.tie(NULL);
in >> n >> q;
for (int i = 1; i <= n; i++)
{
in >> v[i];
}
calc();
while(q--)
{
int a, b;
in >> a >> b;
if (a > b) swap(a, b);
out << query(a, b) << "\n";
}
return 0;
}