Pagini recente » Borderou de evaluare (job #536422) | Cod sursa (job #2540307) | Borderou de evaluare (job #2569884) | Cod sursa (job #2559453) | Cod sursa (job #2571993)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int nmax = 100005;
int n, q;
int a[nmax];
int sp[nmax][30];
inline void construct()
{
for (int i = 1; i <= n; i++)
sp[i][1] = a[i];
for (int j = 2; (1 << (j-1)) <= n; j++)
for (int i = 1; i + (1 << (j-1)) - 1<= n; i++)
sp[i][j] = min(sp[i][j-1], sp[i + (1 << (j-2))][j-1]);
}
inline int querry(int a, int b)
{
if (b < a)
swap(a, b);
int l = b-a+1;
int k = log2(l) + 1;
return min(sp[a][k], sp[b - (1 << (k-1)) + 1][k]);
}
int main()
{
fin >> n >> q;
for (int i = 1; i <= n; i++)
fin >> a[i];
construct();
while (q--)
{
int a, b;
fin >> a >> b;
fout << querry(a, b) << "\n";
}
return 0;
}