Pagini recente » Cod sursa (job #1780433) | Cod sursa (job #664246) | Cod sursa (job #878981) | Cod sursa (job #2105048) | Cod sursa (job #178883)
Cod sursa(job #178883)
#include <stdio.h>
#include <math.h>
#define N 100001
#define M 1000
int puteri[20],lg[100000],a[N][20],v[N];
int n,m;
inline int min(int xx,int yy)
{
if(xx<yy)
return xx;
return yy;
}
void scan()
{
freopen("rmq.in", "r",stdin);
freopen("rmq.out", "w",stdout);
scanf("%d%d", &n,&m);
for(int i=1;i<=n;++i)
scanf("%d", &v[i]);
}
void solve()
{
int x=1,y,put=0;
lg[1]=0;
puteri[0]=1;
for (int i=2;i<=100000;i++)
{
if (x*2<=i)
{
x*=2;
put++;
puteri[put]=x;
}
lg[i]=put;
}
puteri[put+1]=x*2;
for(int i=n;i>=1;--i)
{
a[i][0]=v[i];
for(int j=1;i+puteri[j]<=n+1;++j)
a[i][j]=min(a[i][j-1],a[i+puteri[j-1]][j-1]);
}
for (int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
printf("%d\n",min(a[x][lg[y-x+1]],a[y-puteri[lg[y-x+1]]+1][lg[y-x+1] ]) );
}
}
int main()
{
scan();
solve();
return 0;
}