Pagini recente » Cod sursa (job #1106342) | Cod sursa (job #599239) | Cod sursa (job #2582609) | Cod sursa (job #2893799) | Cod sursa (job #681563)
Cod sursa(job #681563)
#include<stdio.h>
#define MAX 100000
#define LGMAX 18
int X,Y,N,M,v[MAX+3],dp[MAX+3][LGMAX+3],LG[MAX+3];
inline int minim(int x,int y)
{
if(v[x]<v[y]) return x; return y;
}
void deschidere()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
}
void citire()
{
scanf("%d%d",&N,&M);
for(int i=0;i<N;i++)
scanf("%d",&v[i]);
}
void initializare()
{
LG[1]=0;
for(int i=0;i<N;i++)
{
dp[i][0]=i;
if(i>=2)
LG[i]=LG[i/2]+1;
}
}
void rmq()
{
int i,j;
for(j=1; (1<<j) <= N;j++)
for(i=0; i+ (1<<j)-1 <N;i++)
dp[i][j]=minim(dp[i][j-1],dp[i+(1<<j-1)][j-1]);
}
void rezolva()
{
while(M--)
{
scanf("%d%d",&X,&Y);
X--;Y--;
int aux=LG[Y-X];
printf("%d\n",v[minim(dp[X][aux],dp[Y-(1<<aux)+1][aux])]);
}
}
int main()
{
deschidere();
citire();
initializare();
rmq();
rezolva();
return 0;
}