Pagini recente » Cod sursa (job #373934) | Cod sursa (job #2486149) | Cod sursa (job #2171085) | Cod sursa (job #2700714) | Cod sursa (job #657078)
Cod sursa(job #657078)
#include<stdio.h>
#include<assert.h>
#include<algorithm>
using namespace std;
int n,m,p,d[20][101000];
void read()
{
assert(freopen("rmq.in","r",stdin)!=NULL);
int i;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
scanf("%d",&d[0][i]);
}
int log(int x)
{
int t=0;
while(x>0)
{
x/=2;
++t;
}
return t;
}
void preprocess()
{
int i,j,l;
l=log(n)+1;
for(i=1;i<=l;++i)
{
for(j=1;j<=n;++j)
{
if(j+(1<<(i-1))>n)
d[i][j]=d[i-1][j];
else
d[i][j]=min(d[i-1][j],d[i-1][j+(1<<(i-1))]);
//printf("%d ",d[i][j]);
}
//printf("\n");
}
}
int query(int x,int len)
{
int how_does_min_work;
if(len==0)
return d[0][x];
if(p==0)
p=log(len);
while((1<<p)>len)
--p;
how_does_min_work=d[p][x];
return min(how_does_min_work,query(x+(1<<p),len-(1<<p)));
}
void solve()
{
assert(freopen("rmq.out","w",stdout)!=NULL);
int i,x,y;
preprocess();
for(i=1;i<=m;++i)
{
scanf("%d%d",&x,&y);
p=0;
printf("%d\n",query(x,y-x));
}
}
int main()
{
read();
solve();
return 0;
}