Pagini recente » Cod sursa (job #95953) | Cod sursa (job #1892280) | Cod sursa (job #3127769) | Cod sursa (job #220856) | Cod sursa (job #200926)
Cod sursa(job #200926)
#include <cstdio>
#include <cstring>
#define min(a,b) a<b?a:b
int N,M,RMQ[17][100001],log2[100001]; // log(2,100000) ~= 16
void proc_log2()
{
log2[2] = 1;
for(int i=3;i<=N;++i)
if( (i&(i-1)) == 0) log2[i] = log2[i-1] + 1;
else log2[i] = log2[i-1];
}
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d %d",&N,&M);
proc_log2();
memset(RMQ,127,sizeof RMQ);
for(int i=1;i<=N;++i)
scanf("%d",&RMQ[0][i]);
for(int k=1;(1<<k)<=N;++k)
for(int i=1;i<=N;++i)
if(i+(1<<(k-1))<=N)
RMQ[k][i] = min(RMQ[k-1][i],RMQ[k-1][i+(1<<(k-1))]);
else RMQ[k][i] = RMQ[k-1][i];
for(int p1,p2,i=0;i<M;++i)
{
scanf("%d %d",&p1,&p2);
int log2L = log2[p2-p1+1];
printf("%d\n",min(RMQ[log2L][p1],RMQ[log2L][p2+1-(1<<log2L)]));
}
return 0;
}