Pagini recente » Cod sursa (job #921146) | Cod sursa (job #1560935) | Solutii preONI 2007, Runda 4 | Cod sursa (job #2094753) | Cod sursa (job #1679640)
#include <stdio.h>
using namespace std;
#define max 100002
#define lmax 18
int rmq[lmax][max];
int n, m;
int log[max];
int a[max];
int min(int a, int b){
if(a<b) return a;
return b;
}
int main(){
freopen("rmq.in", "r", stdin);
freopen("rmq.out", "w", stdout);
int l;
scanf("%d %d", &n, &m);
for(int i=1; i<=n; i++)
scanf("%d", &a[i]);
log[1]=0;
for(int i=2; i<=n; i++)
log[i]=1+log[i/2];
for(int i=1; i<=n; i++)
rmq[0][i]=a[i];
for(int i=1; (1 << i) <= n; i++)
for(int j=1; j <= n-(1<<i)+l; j++)
{
l=1<<(i-1);
rmq[i][j]=min(rmq[i-1][j],rmq[i-1][j+l]);
}
int x, y, d, shift;
for(int i=1; i<=m; i++)
{
scanf("%d %d", &x, &y);
d=y-x+1;
l=log[d];
shift=d-(1<<l);
printf("%d\n", min(rmq[l][x], rmq[l][shift+x]));
}
return 0;
}