Pagini recente » Cod sursa (job #971282) | Cod sursa (job #1006929) | Cod sursa (job #2931844) | Cod sursa (job #2450868) | Cod sursa (job #2084967)
#include <bits/stdc++.h>
using namespace std;
const int N_MAX = 100000 + 5;
int n, m, dp[N_MAX][30], a[N_MAX];
ifstream fin ("rmq.in");
ofstream fout("rmq.out");
void init() {
for(int i = 1; i <= n; i++)
dp[i][0] = i;
for(int j = 1; (1 << j) <= n; j++)
for(int i = 1; i + (1 << j) - 1 <= n; i++)
if (a[dp[i][j - 1]] < a[dp[i + (1 << (j - 1))][j - 1]])
dp[i][j] = dp[i][j - 1];
else
dp[i][j] = dp[i + (1 << (j - 1))][j - 1];
}
int query(int i, int j){
int k = log2(j - i + 1);
if(a[dp[i][k]] <= a[dp[j - (1 << k) + 1][k]])
return dp[i][k];
return dp[j - (1 << k) + 1][k];
}
int main () {
fin >> n >> m;
for(int i = 1; i<=n; ++i)
fin >> a[i];
init();
while(m--){
int aa, bb; fin >> aa >> bb;
fout << a[query(aa, bb)] << "\n";
}
}