Pagini recente » Cod sursa (job #556210) | Cod sursa (job #582816) | Cod sursa (job #481809) | Cod sursa (job #1793435) | Cod sursa (job #1402658)
#include <iostream>
#include <cstdio>
#define MAXN 100009
#define LOGN 32
using namespace std;
int n, m, dp[LOGN][MAXN], a[MAXN];
int din(int i, int j)
{
if (j <= n)
return dp[i][j];
return dp[i][n];
}
// dp[i][j] = minimul din intervalul [j, j+(1<<i)-1]
void solve()
{
for (int i = 1; i <= n; i++)
dp[0][i] = a[i];
for (int i = 1; 2*(n-1)>>i; i++)
for (int j = 1; j <= n; j++)
dp[i][j] = min(din(i-1,j), din(i-1, j+(1<<(i-1))));
}
inline int log2(int x)
{
int i;
for (i = 0; x>>i; i++);
return i-1;
}
int main()
{
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
scanf("%d %d", &n, &m);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
solve();
int x, y;
for (int i = 0; i < m; i++)
{
scanf("%d %d", &x, &y);
int df = y-x+1;
int ind = log2(df);
printf("%d\n", min(din(ind, x), din(ind, y+1-(1<<ind))));
}
return 0;
}