这道题和 hdu 3874 几乎一模一样
#include<iostream>
#include<map>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll a[30002];
ll sum[300003];
ll ans[130000];
map<int,int>mp;
const long long int N = 300000;
struct point
{
ll l;
ll r;
ll d;
}p[100005];
bool cmp(point a,point b)
{
return a.r<b.r;
}
void add(ll x,ll w)
{
while(x<N)
{
sum[x]+=w;
x+=x&-x;
}
}
ll getsum(ll x)
{
ll ans=0;
while(x)
{
ans+=sum[x];
x-=x&-x;
}
return ans;
}
int main()
{
ll t;
cin>>t;
while(t--)
{
mp.clear();
memset(sum,0,sizeof(sum));
ll n;
cin>>n;
ll i,j;
for(i=1;i<=n;i++)
{
cin>>a[i];
}
ll m;
cin>>m;
for(i=0;i<m;i++)
{
cin>>p[i].l>>p[i].r;
p[i].d=i;
}
sort(p,p+m,cmp);
ll rr=1;
for(i=0;i<m;i++)
{
while(rr<=p[i].r)
{
if(mp[a[rr]])
{
add(mp[a[rr]],-a[rr]);
}
add(rr,a[rr]);
mp[a[rr]]=rr;
rr+=1;
}
ans[p[i].d]=getsum(p[i].r)-getsum(p[i].l-1);
}
for(i=0;i<m;i++)
cout<<ans[i]<<endl;
}
}