Pagini recente » Cod sursa (job #2982916) | Cod sursa (job #1426159) | Cod sursa (job #1976902) | Cod sursa (job #3220333) | Cod sursa (job #1069789)
#include <stdio.h>
#include <math.h>
#include<algorithm>
using namespace std;
const int nmax = 103000;
int n,m,a[nmax],p[nmax][100];
void create(){
for(int i =0 ;i<n;i++)p[i][0]=i;
/*
for(int i = 1 ;1<<i <= n;i++)
for(int j = 0 ;j+(1<<i)-1 < n;j++)
if(a[p[j][i-1]]<a[p[j+(1<<(i-1))][i-1]])p[j][i]=p[j][i-1];
else p[j][i]=p[j+(1<<(i-1))][i-1];
*/
for (int j = 1; 1 << j <= n; j++)
for (int i = 0; i + (1 << j) - 1 < n; i++)
if (a[p[i][j - 1]] < a[p[i + (1 << (j - 1))][j - 1]])
p[i][j] = p[i][j - 1];
else
p[i][j] = p[i + (1 << (j - 1))][j - 1];
}
int minim(int x,int y){
x-=1;y-=1;
int k;// = trunc(log);//log(y-x+1)
for(k=1; 1<<k<=y-x+1;k++);k--;//return k;
return min(a[p[x][k]],a[p[y-(1<<k)+1][k]]);
}
int main(){
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%ld%ld",&n,&m);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
}
//create();
for(int i =0 ;i<n;i++)p[i][0]=i;
/*
for(int i = 1 ;1<<i <= n;i++)
for(int j = 0 ;j+(1<<i)-1 < n;j++)
if(a[p[j][i-1]]<a[p[j+(1<<(i-1))][i-1]])p[j][i]=p[j][i-1];
else p[j][i]=p[j+(1<<(i-1))][i-1];
*/
for (int j = 1; 1 << j <= n; j++)
for (int i = 0; i + (1 << j) - 1 < n; i++)
if (a[p[i][j - 1]] < a[p[i + (1 << (j - 1))][j - 1]])
p[i][j] = p[i][j - 1];
else
p[i][j] = p[i + (1 << (j - 1))][j - 1];
int x,y,k;
for(int i=1;i<=m;i++){
scanf("%d %d",&x,&y);
// int k;// = trunc(log);//log(y-x+1)
for(k=1; 1<<k<=y-x+1;k++);k--;//return k;
//return min(a[p[x][k]],a[p[y-(1<<k)+1][k]]);
printf("%d\n",min(a[p[x-1][k]],a[p[y-(1<<k)][k]]));
}
fclose(stdout); fclose(stdin);
return 0;
}