Pagini recente » Istoria paginii utilizator/cergan.naomi | Cod sursa (job #1772799) | Cod sursa (job #991548) | Cod sursa (job #1599448) | Cod sursa (job #534576)
Cod sursa(job #534576)
#include<cstdio>
#include<cmath>
const int N=100005,INF=2000000000;
int logn,n,q,p2[20],min[N][20];
void read()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
scanf("%d",&min[i][0]);
}
void pregen()
{
logn=log2(n);
p2[0]=1;
for(int i=1;i<=logn;i++)
p2[i]=p2[i-1]<<1;
for(int i=0;i<=logn;i++)
min[0][i]=INF;
}
int minim(int x,int y)
{
return x<y?x:y;
}
void din()
{
for(int j=1;j<=logn;j++)
for(int i=1;i<=n;i++)
min[i][j]=minim(min[i][j-1],min[i+p2[j-1]][j-1]);
}
int cautb(int val)
{
int i=0,pas=1<<5;
for(i=0;pas;pas>>=1)
if(i+pas<=logn && p2[i+pas]<=val)
i+=pas;
return i;
}
int rmq(int x,int y)
{
if(x>y)
return INF;
if(x==y)
return min[x][0];
int put=cautb(y-x);
return minim(min[x][put],rmq(x+p2[put],y));
}
int main()
{
int x,y;
read();
pregen();
din();
for(int i=1;i<=q;i++)
{
scanf("%d%d",&x,&y);
x=rmq(x,y);
printf("%d\n",x);
}
return 0;
}