给定原序列和若干个区间范围,查询区间的最大值或者最小值。
int dp[N][30],a[N];
void rmq_init(int n)
{
for(int i=1; i<=n; i++)
dp[i][0]=a[i];
for(int j=1; (1<<j)<=n; j++)
for(int i=1; i+(1<<j)-1<=n; i++)
dp[i][j]=min(dp[i][j-1],dp[i+(1<<(j-1))][j-1]);
}
int query(int l,int r)
{
int k=(int)(log10(r-l+1)/log10(2.0));
int num=min(dp[l][k],dp[r-(1<<k)+1][k]);
return num;
}