Pagini recente » Cod sursa (job #1946012) | Cod sursa (job #1804833) | Cod sursa (job #1621571) | Cod sursa (job #1793182) | Cod sursa (job #422671)
Cod sursa(job #422671)
#include<iostream>
#include<string>
using namespace std;
#define KM 18
#define NM 100005
int RMQ[NM][KM],A[NM],LG[NM],N,M;
int main()
{
int p2[KM],a,b;
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d %d",&N,&M);
for(int i=1;i<=N;++i)
scanf("%d",&A[i]);
p2[0]=1;
for(int i=1;i<KM;++i)
p2[i]=p2[i-1]*2;
for(int i=1;i<=N;++i)
RMQ[i][0]=A[i];
for(int j=1;j<KM;++j)
for(int i=1;;++i)
{
if(i+p2[j]-1>N) break;
RMQ[i][j]=min(RMQ[i][j-1],RMQ[i+p2[j-1]][j-1]);
}
int ind=1,pt=0;
while(ind<=N)
{
int depus=p2[pt];
while(ind<=N && depus)
{
LG[ind]=pt;
++ind;
--depus;
}
++pt;
}
while(M--)
{
scanf("%d %d",&a,&b);
int lg=b-a+1;
pt=LG[lg];
int ans=min(RMQ[a][pt],RMQ[b-p2[pt]+1][pt]);
printf("%d\n",ans);
}
return 0;
}