蒜头君有 n 个数,他提出了 q 个问题,每个问题是说,询问前 x 个数的极差(最大值减最小值)。你能帮助他解决这 q 个问题吗?
输入格式:
第一行两个整数 n,q(1 ≤ n,q ≤ 105 )
第二行 n 个整数 ai (1 ≤ ai ≤ 109 ) 表示蒜头君的 n 个数
第三行 q 个整数 xi (1 ≤ xi ≤ n) ,表示每一次询问
输出格式:
输出一行,包含 q 个整数,表示每一次询问的答案
数据范围:
对于 60% 的数据, 1 ≤ n,q ≤ 103
对于 100% 的数据,1 ≤ n,q ≤ 105
Inputcopy:
5 5
3 2 4 5 1
1 2 3 4 5
Outputcopy;
二、方法一 1、思路0 1 2 3 4
用两个数组分别存放前 i 个数中的最大值和最小值,然后用一个数组来存放极差(打表),然后询问即可。
2、代码#include#define Max 100005 int n, q; // n 个数,p 次提问 int i, j, k; // 遍历 int max[Max], min[Max]; // max存放最大值,min存放最小值 int a[Max]; // n 个数的数组 int b[Max]; // 存放前 n 个数的极值 int x; int main() { scanf("%d %d", &n, &q); for (i = 1; i <= n; i++) { scanf("%d", &a[i]); if (i == 1) max[i] = a[i], min[i] = a[i]; else { max[i] = max[i - 1] > a[i] ? max[i - 1] : a[i]; min[i] = min[i - 1] < a[i] ? min[i - 1] : a[i]; } b[i] = max[i] - min[i]; } for (i = 1; i < q; i++) { scanf("%d", &x); printf("%d ", b[x]); } scanf("%d", &x); printf("%d", b[x]); return 0; }



