Pagini recente » Cod sursa (job #530673) | Cod sursa (job #3202982) | Cod sursa (job #2121003) | Cod sursa (job #2712789) | Cod sursa (job #615222)
Cod sursa(job #615222)
/*
complexitate: O (N*logN+M)
memorie: N*logN
*/
#include<cstdio>
#define minim(a,b) (a<b)? (a):(b)
#define NM 100005
int N,M,a[18][NM],log[NM];
inline void read()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d%d",&N,&M);
scanf("%d",&a[0][1]);
for (int i=2; i<=N; ++i)
{
scanf("%d",&a[0][i]);
log[i]=1+log[i>>1];
}
}
inline void rmq()
{
for (int i=1; i<=log[N]; ++i)
{
int lung=1<<i;
int jum=lung>>1;
for (int j=1; j+lung-1<=N; ++j)
if (a[i-1][j]<a[i-1][j+jum])
a[i][j]=a[i-1][j];
else
a[i][j]=a[i-1][j+jum];
}
}
inline int solve(int x, int y)
{
/*if (x>y)
x^=y^=x^=y;*/
int lung=1<<log[y-x+1];
int lo=log[lung];
return minim(a[lo][x],a[lo][y-lung+1]);
}
inline void query()
{
while(M--)
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",solve(x,y));
}
}
int main()
{
read();
rmq();
query();
return 0;
}