这道题的题意大概是,输入一串数字,没排序之前编号为1,从小到大排完序编号为2.
然后再输入编号,计算从第l个数字到第r个数字相加的和;
因为v1, v2, ..., vn (1 ≤ vi ≤ 10^9);
所以数组用long long声明;
开三个数组,数组a用来记录输入的数字;
数组b是排序前的累加值,数组c是排序后的累加值;
b[r]-b[l-1]即为排序前从第l个数字到第r个数字相加的和;
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
long long a[100010];
long long b[100010];//用于记录排序前的累加值的大小b[i]=a[0]+……a[i]
long long c[100010];//用于记录排序后的累加值的大小c[i]=a[0]+……a[i]
int t;
cin>>t;
for(int i=0;i<t;i++)
{
cin>>a[i];
b[i+1]=a[i]+b[i];
}
sort(a,a+t);
for(int i=0;i<t;i++)
{
c[i+1]=a[i]+c[i];
}
int n;
cin>>n;
while(n--)
{
int e,l,r;
cin>>e>>l>>r;
if(e==1)
{
cout<<b[r]-b[l-1]<<endl;
}
if(e==2)
{
cout<<c[r]-c[l-1]<<endl;
}
}
}