Pagini recente » Cod sursa (job #2606150) | Cod sursa (job #170054) | Cod sursa (job #1033536) | Cod sursa (job #14530) | Cod sursa (job #998825)
Cod sursa(job #998825)
#include<stdio.h>
int v[100002],d[100002][20],d2[100002][20],Log[100002];
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
int n,m,i,j,sol,e,l,k;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
scanf("%d",&v[i]);
///////////////
for(i=1;i<=n;++i)
d[i][0]=i;
v[0]=2000000000;
for(j=1;1<<j<=n;++j)
{
for(i=1;i+(1<<j)-1<=n;++i)
{
if(v[d[i][j-1]]<=v[d[i+(1<<(j-1))][j-1]])
d[i][j]=d[i][j-1];
else
d[i][j]=d[i+(1<<(j-1))][j-1];
}
}
//////////////////////
///////////////////
e=0;
l=1;
for(i=1;i<=n;++i)
{
if(i>=l*2)
{
l*=2;
++e;
}
Log[i]=e;
}
///////////////
while(m--)
{
scanf("%d%d",&i,&j);
sol=2000000000;
k=Log[j-i+1];
if(v[d[i][k]]<=v[d[j-(1<<k)+1][k]])
sol=v[d[i][k]];
else
sol=v[d[j-(1<<k)+1][k]];
printf("%d\n",sol);
}
return 0;
}
/*
#include<stdio.h>
int v[100002],d[1000002][20],d2[1000002][20],Log[100002];
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
int n,m,i,j,sol,sol2,e,l,k;
scanf("%d%d",&n,&m);
for(i=1;i<=n;++i)
scanf("%d",&v[i]);
///////////////
for(i=1;i<=n;++i)
d[i][0]=i;
v[0]=2000000000;
for(j=1;1<<j<=n;++j)
{
for(i=1;i+(1<<j)-1<=n;++i)
{
if(v[d[i][j-1]]<=v[d[i+(1<<(j-1))][j-1]])
d[i][j]=d[i][j-1];
else
d[i][j]=d[i+(1<<(j-1))][j-1];
}
}
//////////////////////
for(i=1;i<=n;++i)
d2[i][0]=i;
for(j=1;1<<j<=n;++j)
{
for(i=1;i+(1<<j)-1<=n;++i)
{
if(v[d2[i][j-1]]>=v[d2[i+(1<<(j-1))][j-1]])
d2[i][j]=d2[i][j-1];
else
d2[i][j]=d2[i+(1<<(j-1))][j-1];
}
}
///////////////////
e=0;
l=1;
for(i=1;i<=n;++i)
{
if(i>=l*2)
{
l*=2;
++e;
}
Log[i]=e;
}
///////////////
while(m--)
{
scanf("%d%d",&i,&j);
sol=2000000000;
k=Log[j-i+1];
if(v[d[i][k]]<=v[d[j-(1<<k)+1][k]])
sol=v[d[i][k]];
else
sol=v[d[j-(1<<k)+1][k]];
if(v[d2[i][k]]>=v[d2[j-(1<<k)+1][k]])
sol2=v[d2[i][k]];
else
sol2=v[d2[j-(1<<k)+1][k]];
printf("%d\n",sol2-sol);
}
return 0;
}
*/