题目链接:Codeforces 433B Kuriyama Mirai's Stones
记录两种前n项和,一种是原数组的,一种是排序后的。
如果用下标0表示第一个数需要注意下标可能变成负数,因为这个在Test2上WA了好几次,本地跑居然没错,Codeblocks不要这么智能好不好==。
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAX_N = 100000 + 100;
int arr1[MAX_N], arr2[MAX_N];
long long sum1[MAX_N], sum2[MAX_N];
int main()
{
//freopen("in.txt", "r", stdin);
int n;
scanf("%d", &n);
for(int i = 0; i < n; i++)
{
scanf("%d", &arr1[i]);
arr2[i] = arr1[i];
}
sort(arr2, arr2 + n);
sum1[0] = arr1[0], sum2[0] = arr2[0];
for(int i = 1; i < n; i++)
{
sum1[i] = sum1[i - 1] + arr1[i];
sum2[i] = sum2[i - 1] + arr2[i];
}
int q, type, a, b;
long long res;
scanf("%d", &q);
for(int i = 0; i < q; i++)
{
scanf("%d%d%d", &type, &a, &b);
a--, b--;
if(type == 1)
{
if(a == 0)
printf("%I64d\n", sum1[b]);
else
{
res = sum1[b] - sum1[a - 1];
printf("%I64d\n", res);
}
}
else
{
if(a == 0)
printf("%I64d\n", sum2[b]);
else
{
res = sum2[b] - sum2[a - 1];
printf("%I64d\n", res);
}
}
}
return 0;
}