范围内最高最矮树高度差问题

问题:N棵树排成一排。考虑到每棵树的高度H,小明被要求回答M个问题。每个问题包含两个数字L和R,询问间隔[L,R]中最高树和最短树之间的高度差。帮助小明解决这个问题

输入的第一行包含两个整数N和M,表示树的数量和问题的数量
以下N行中的每一行都包含一个整数Hi,表示每棵树的高度。以下M行中的每一行都包含两个整数Li和Ri,表示每个问题的间隔。
输出:从第1行到第m行,每行包含一个整数,表示从第Lth树到第Rth树的最高树和最短树之间的高度差。

img

tree[i]代表第i棵树的高度
假设dp[i][j][0] 代表[i,j]区间最大值,dp[i][j][1]代表[i,j]区间最小值
可知dp[i][j][0] = dp[i][j][1] = tree[i] 当i=j时
dp[i][j][0]= Max(tree[j],dp[i][j-1][0]) j>i
dp[i][j][1]= Min(tree[j],dp[i][j-1][1]) j>i
最后求解[x,y]区间,为dp[x][y][0] - dp[x][y][1]

1.处理输入
对于一行只有一个数据的,直接存入数据。对于一行有多个数据的,以空格分割。
输入有N、M、N行Hi、M行Li和Ri。由题可知都是整数,各定义一个变量。其中Hi和Problem(存储Li和Ri)为数组。定义时不知道M和N则使用动态分配来创建数组。
Solution数组存储答案。
2.处理数据
读取P的第2M-2和2M-1个数据,传入检测函数。检测函数首先用传入的Li和Ri从Hi中取出一段,然后用擂台排序排出最高和最低。最后相减,返回这个值。
返回的值存入Solution[M]。
3.输出
for(int i=0;i<M;i++) cout<<Solution[i];