Pagini recente » Cod sursa (job #340587) | Cod sursa (job #2668257) | Cod sursa (job #2514989) | Cod sursa (job #1007859) | Cod sursa (job #681562)
Cod sursa(job #681562)
#include<stdio.h>
#define MAX 100000
#define LGMAX 20
int X,Y,N,M,v[MAX+3],dp[MAX+3][LGMAX+3],LG[MAX+3];
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;
}
LG[N]=LG[N/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)][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;
}