题目本身没什么 但是要注意ll 线段树得查询里面也要ll啊 就是因为这个wa了无数次
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
#define ll __int64
#define maxn 111111
#define ls (rt<<1)
#define rs (rt<<1|1)
#define mid ((l+r)>>1)
int n,m,q;
ll x;
int last[maxn<<2];
ll a[maxn<<2];
ll sum[maxn<<2];
pair<ll,int>b[maxn<<2];
ll ans[maxn<<2];
struct Node{
int l;int r;int pos;
}node[maxn<<2];
bool cmp(pair<int,int> x,pair<int,int> y){
if(x.first!=y.first)return x.first<y.first;
else return x.second<y.second;
}
bool cmp1(Node x,Node y){
if(x.r!=y.r)return x.r<y.r;
else return x.pos<y.pos;
}
void up(int rt,int l,int r){sum[rt]=sum[ls]+sum[rs];}
void build(int rt,int l,int r){
sum[rt]=0;
if(l==r)return ;
build(ls,l,mid);
build(rs,mid+1,r);
up(rt,l,r);
}
void ins(int rt,int l,int r,int L,int R,ll w){
if(L<=l&&r<=R){
sum[rt]=w;
return ;
}
if(L<=mid)ins(ls,l,mid,L,R,w);
if(mid<R)ins(rs,mid+1,r,L,R,w);
up(rt,l,r);
}
ll query(int rt,int l,int r,int L,int R){
if(L<=l&&r<=R){
return sum[rt];
}
ll ans=0;
if(L<=mid)ans+=query(ls,l,mid,L,R);
if(mid<R)ans+=query(rs,mid+1,r,L,R);
return ans;
}
int main(){
int t;scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%I64d",&x);
a[i]=b[i].first=x;
b[i].second=i;
}
build(1,1,n);
//last
sort(b+1,b+1+n,cmp);
last[b[1].second]=b[1].second;
for(int i=2;i<=n;++i){
if(b[i].first==b[i-1].first){
last[b[i].second]=b[i-1].second;
}else last[b[i].second]=b[i].second;
}
scanf("%d",&q);
for(int i=1;i<=q;++i){
scanf("%d%d",&node[i].l,&node[i].r);
node[i].pos=i;
}
sort(node+1,node+q+1,cmp1);
for(int i=1,j=1;i<=n;++i){
if(last[i]!=i)ins(1,1,n,last[i],last[i],0);
ins(1,1,n,i,i,a[i]);
while(node[j].r==i&&j<=q){
ans[node[j].pos]=query(1,1,n,node[j].l,node[j].r);
j++;
}
}
for(int i=1;i<=q;++i){
printf("%I64d\n",ans[i]);
}
}
return 0;
}