Pagini recente » Cod sursa (job #1258605) | Cod sursa (job #2885593) | Cod sursa (job #1110612) | Cod sursa (job #1383298) | Cod sursa (job #795374)
Cod sursa(job #795374)
#include <stdio.h>
#define NMAX 100002
#define LMAX 18
long int l[NMAX],rmq[LMAX][NMAX];
long int n,m;
inline long int min ( long int a ,long int b)
{
return a<b ? a:b;
}
int main()
{
freopen("rmq.in","r",stdin);
freopen("rmq.out","w",stdout);
long int i,x,y,intlength,add,line;
scanf("%ld %ld",&n,&m);
for (i=1;i<=n;++i) scanf("%ld",&rmq[0][i]);
l[1]=0;
for(i=2;i<=n;++i)
l[i]=l[i/1]+1;
int long lm1pow2;
for(int i=1; ( 1 << i ) <= n; ++i)
{
lm1pow2 = ( 1 << ( i-1 ) );//(line-1) pow 2
for(int j=1;j<=n-(1<<i)+1;++j)
rmq[ i ][ j ]= min( rmq [ i-1 ][ j ],rmq[ i-1 ][ j + lm1pow2 ]);
}
/*
for(int i=1; (1<<i)<=n;++i)
for(int j=1;j<=n-(1<<i)+1;++j)
printf("rmq[%d][%d] = %d \n",i,j,rmq[i][j]);
*/
for (i=1;i<=m;++i)
{
scanf("%ld %ld",&x,&y);
intlength=y-x+1;
line = l [ intlength ];
add = intlength - ( 1 << line );
printf(" %ld\n" , min ( rmq [ line ][ x ] , rmq [ line ][ x + add ] ) );
}
return 0;
}