Pagini recente » Cod sursa (job #2653935) | Cod sursa (job #3270307) | Cod sursa (job #163647) | Cod sursa (job #646209) | Cod sursa (job #998822)
Cod sursa(job #998822)
#include<stdio.h>
int v[100002],d[100002][20],Log[100002];
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
int n,m,i,j,x,y,sol,e,l;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
scanf("%d",&v[i]);
///////////////
for(i=1;i<=n;++i)
d[i][0]=i;
v[0]=2000000000;
for(j=1;1<<j<=n;++j)
{
for(i=1;i+(1<<j)-1<=n;++i)
{
if(v[d[i][j-1]]<=v[d[i+(1<<(j-1))][j-1]])
d[i][j]=d[i][j-1];
else
d[i][j]=d[i+(1<<(j-1))][j-1];
}
}
Log[1]=1;
Log[2]=1;
for(i=2;(i<<i)<=n;++i)
Log[(1<<i)]=i;
for(i=3;i<=n;++i)
if(!Log[i])
Log[i]=Log[i-1];
///////////////
while(m--)
{
scanf("%d%d",&x,&y);
sol=2000000000;
i=x;
while(i<=y)
{
j=Log[y-x+1];
if(v[d[i][j]]<sol)
sol=v[d[i][j]];
i=i+(1<<j);
}
printf("%d\n",sol);
}
return 0;
}