题面如上。
对于第 l 小到第 r 小实际上就是从小到大的区间。
那先对数组进行从小到大的排序,排完之后因为要对每个区间进行求和,如果暴力的求那个区间的和的话会超时,实际上可以用到前缀和的知识,然后就输出前缀和的答案即可。不会前缀和的可以去csdn学一下。
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
int a[101010];
ll pre[101010];
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
sort(a + 1, a + 1 + n);
for (int i = 1; i <= n; i++) {
pre[i] = a[i] + pre[i - 1];
}
for (int i = 1; i <= m; i++) {
int l, r;
cin >> l >> r;
cout << pre[r] - pre[l - 1] << endl;
}
return 0;
}