Pagini recente » Cod sursa (job #864194) | Borderou de evaluare (job #214631) | Cod sursa (job #449248) | Cod sursa (job #204017) | Cod sursa (job #2909194)
#include <bits/stdc++.h>
using namespace std;
const int Max = 1e5;
ifstream f("rmq.in");
ofstream g("rmq.out");
#define cin f
#define cout g
int n, m, log2n, arr[Max], rmq[Max][20];
int main()
{
cin >> n >> m;
log2n = floor(log(n) / log(2));
for(int i = 0; i < n; i ++)
cin >> arr[i];
for(int i = 0; i < n; i ++)
rmq[i][0] = i;
for(int j = 1, size = 2; size <= n; j ++, size <<= 1)
{
for(int i = 0; i + size - 1 < n; i ++)
if(arr[rmq[i][j - 1]] <= arr[rmq[i + size / 2][j - 1]])
rmq[i][j] = rmq[i][j - 1];
else
rmq[i][j] = rmq[i + size / 2][j - 1];
}
while(m --)
{
int i, j;
cin >> i >> j;
i --, j --;
int k = floor(log(j - i + 1) / log(2));
cout<<min(arr[rmq[i][k]], arr[rmq[j - (1 << k) + 1][k]])<<'\n';
}
return 0;
}