Pagini recente » Cod sursa (job #2302394) | Cod sursa (job #546477) | Cod sursa (job #2128100) | Cod sursa (job #2567602) | Cod sursa (job #910956)
Cod sursa(job #910956)
#include <cstdio>
using namespace std;
int n,m,x[100001];
int tt[100001][20];
void preproc()
{
for(int i=1;i<=n;++i)
tt[i][0]=i;
for(int i=1;(1<<i)<=n;++i)
for(int j=1;j+(1<<i)-1<=n;++j)
{
if(x[tt[j][i-1]]<x[tt[j+(1<<(i-1))][i-1]])
tt[j][i]=tt[j][i-1];
else
tt[j][i]=tt[j+(1<<(i-1))][i-1];
}
}
int rmq(int i, int j)
{
int l=1;
while(1<<l<(j-i+1)/2)
l++;
if(x[tt[i][l]]<x[tt[j-(1<<l)+1][l]])
return x[tt[i][l]];
else
return x[tt[j-(1<<1)+1][l]];
}
void citire()
{
int a,b;
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)
scanf("%d",&x[i]);
preproc();
for(int i=1;i<=m;++i)
{
scanf("%d%d",&a,&b);
printf("%d\n",rmq(a,b));
}
}
int main()
{
citire();
return 0;
}