Pagini recente » Cod sursa (job #2332506) | Cod sursa (job #420495) | Cod sursa (job #2714276) | Cod sursa (job #378016) | Cod sursa (job #2976299)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("rmq.in");
ofstream fout("rmq.out");
const int NMAX = 100005;
const int LGMAX = 20;
int n, m;
int lg[NMAX], a[NMAX], lookup[NMAX][LGMAX];
void rmq()
{
lookup[1][0] = 1;
for (int i=2;i<=n;i++){
lg[i] = lg[(i>>1)] + 1;
lookup[i][0] = i;
}
for (int j=1;(1<<j)<=n;j++){
for (int i=1;(i+(1<<j)-1)<=n;i++){
if (a[lookup[i][j-1]] < a[lookup[i+(1<<(j-1))][j-1]])
lookup[i][j] = lookup[i][j-1];
else
lookup[i][j] = lookup[i+(1<<(j-1))][j-1];
}
}
}
int query(int x, int y)
{
int j = lg[y-x+1]; // j = 4-2+1 = lg[3] = 1
if (a[lookup[x][j]] < a[lookup[y-(1<<j)+1][j]])
return a[lookup[x][j]];
else
return a[lookup[y-(1<<j)+1][j]];
}
int main()
{
fin >> n >> m;
for (int i=1;i<=n;i++){
fin >> a[i];
}
rmq();
for (int i=1;i<=m;i++){
int p, q;
fin >> p >> q;
fout << query(p, q) << '\n';
}
return 0;
}