Pagini recente » Cod sursa (job #2630058) | Cod sursa (job #2886200) | Cod sursa (job #42719) | Cod sursa (job #3233956) | Cod sursa (job #2605262)
#include<cstdio>
#include<algorithm>
using namespace std;
FILE*in=fopen("rmq.in","r");
FILE*out=fopen("rmq.out","w");
int v[100003],po[19],n,m,i,j,k,pd[100003][19],mij,a,b,lg,ras;
int log(int p)
{
int st=0,dr=i-2;
while(st<=dr)
{
mij=(st+dr)/2;
if(po[mij]>p)
{
dr=mij-1;
}
else
{
st=mij+1;
}
}
while(po[mij]<p)
{
mij++;
}
while(po[mij]>=p)
{
mij--;
}
return mij;
}
int main()
{
fscanf(in,"%d%d",&n,&m);
for(i=1;i<=n;i++)
{
fscanf(in,"%d",&v[i]);
pd[i][0]=v[i];
}
po[0]=1;
for(i=1;po[i-1]<=n;i++)
{
po[i]=po[i-1]*2;
}
for(j=1;j<i-1;j++)
{
for(k=1;k<=n-po[j]+1;k++)
{
pd[k][j]=min(pd[k][j-1],pd[k+po[j-1]][j-1]);
}
}
for(j=1;j<=m;j++)
{
fscanf(in,"%d%d",&a,&b);
if(a==b)
{
fprintf(out,"%d\n",v[a]);
continue;
}
lg=log(b-a+1);
ras=min(pd[a][lg],pd[b-po[lg]+1][lg]);
fprintf(out,"%d\n",ras);
}
}