void Rmq_init( int n , int b[] )
{
mm[0] = -1;
for ( int i=1 ; i<=n ; i++ )
{
mm[i] = ((i&(i-1))==0)?mm[i-1]+1:mm[i-1];
dp[i][0] = b[i];
}
for ( int j=1 ; j<=mm[n] ; j++ )
for ( int i=1 ; i+(1<<j)-1<=n ; i++ )
dp[i][j] = Max( dp[i][j-1] , dp[i+(1<<(j-1))][j-1] );
}
int Rmq_Query( int l , int r )
{
int k = mm[r-l+1];
return Max( dp[l][k] , dp[r-(1<<k)+1][k] );
}