Pagini recente » info_bv_11-12-1 | Monitorul de evaluare | Cod sursa (job #1888987) | Cod sursa (job #1184339) | Cod sursa (job #534607)
Cod sursa(job #534607)
#include<cstdio>
#include<cmath>
#include<fstream>
using namespace std;
const int N=100015,INF=2000000000;
int logn,n,q,p2[30],minn[N][30];
ifstream f("rmq.in");
void read()
{
freopen("rmq.out","w",stdout);
f>>n>>q;
for(int i=1;i<=n;i++)
f>>minn[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++)
minn[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+p2[j]-1<=n;i++)
minn[i][j]=minim(minn[i][j-1],minn[i+p2[j-1]][j-1]);
}
int cautb(int val)
{
int i=0,pas=1<<4;
for(i=0;pas;pas>>=1)
if(i+pas<=logn && p2[i+pas]<=val)
i+=pas;
return i;
}
int rmq(int x,int y)
{
int minc,j=cautb(y-x+1);
minc=minn[x][j];
if(minn[y-p2[j]+1][j]<minc)
minc=minn[y-p2[j]+1][j];
return minc;
}
int main()
{
int x,y;
read();
pregen();
din();
for(int i=1;i<=q;i++)
{
f>>x>>y;
x=rmq(x,y);
printf("%d\n",x);
}
return 0;
}