Pagini recente » Cod sursa (job #1287365) | Borderou de evaluare (job #2346189) | Cod sursa (job #2170003)
#include <bits/stdc++.h>
using namespace std;
const int mxn = 100 * 1000 + 10;
const int mxl = 18;
int n, m;
int v[ mxn ];
int lg[ mxn ], rmq[ mxl ][ mxn ];
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", &v[ i ]);
lg[ 1 ] = 0;
for(int i = 2; i <= n; i++)
lg[ i ] = lg[ i / 2 ] + 1;
for(int i = 1; i <= n; i++)
rmq[ 0 ][ i ] = v[ i ];
int l;
for(int i = 1; (1 << i) <= n; i++)
for(int j = 1; j <= n - (1 << i) + 1; j++){
l = 1 << (i - 1);
rmq[ i ][ j ] = min(rmq[ i - 1 ][ j ], rmq[ i - 1 ][ j + 1]);
}
for(int i = 1, x, y, d, k; i <= m; i++){
scanf("%d %d", &x, &y);
d = y - x + 1;
l = lg[ d ];
k = d - (1 << l);
printf("%d\n", min(rmq[ l ][ x ], rmq[ l ][ x + k ]));
}
return 0;
}