Now Mery thinks the necklace is too long. She plans to take some continuous part of the necklace to build a new one. She wants to know each of the beautiful value of M continuous parts of the necklace. She will give you M intervals [L,R] (1<=L<=R<=N) and you must tell her F(L,R) of them.
For each case, the first line is a number N,1 <=N <=50000, indicating the number of the magic balls. The second line contains N non-negative integer numbers not greater 1000000, representing the beautiful value of the N balls. The third line has a number M, 1 <=M <=200000, meaning the nunber of the queries. Each of the next M lines contains L and R, the query.
2 6 1 2 3 4 3 5 3 1 2 3 5 2 6 6 1 1 1 2 3 5 3 1 1 2 4 3 5
3 7 14 1 3 6
//
先对y排序,记录每一个值前一个出现的位置,然后每次一个值v时,若前面出现过v则将前面一个v灭掉,然后将当前位置加上v。。。其实就是保留最后一个出现v的位置的v,前面的地方都归0.
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
const int maxn=50010;
//离线算法
int n;
__int64 c[maxn];
int lowbit(int x){return x&(-x);}
void update(int x,int val)
{
for(int i=x;i<=n;i+=lowbit(i))
{
c[i]+=val;
}
}
__int64 getsum(int x)
{
__int64 cnt=0;
for(int i=x;i>=1;i-=lowbit(i))
{
cnt+=c[i];
}
return cnt;
}
int a[maxn];
map<int,int> hash;
struct Node
{
int l,r;
int idx;
};
Node qu[maxn*4];
__int64 ans[maxn*4];
bool cmp(Node h,Node k)
{
return h.r<k.r;
}
int main()
{
int ci;scanf("%d",&ci);
while(ci--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int q;scanf("%d",&q);
for(int i=0;i<q;i++)
{
int l,r;scanf("%d%d",&l,&r);
if(l>r) swap(l,r);
qu[i].l=l,qu[i].r=r;
qu[i].idx=i;
}
sort(qu,qu+q,cmp);
for(int i=1;i<=n;i++) c[i]=0;
hash.clear();
int r=1;
for(int i=0;i<q;i++)
{
while(r<=qu[i].r)
{
if(hash[a[r]]!=0)
{
update(hash[a[r]],-a[r]);
}
hash[a[r]]=r;
update(r,a[r]);
r++;
}
ans[qu[i].idx]=getsum(qu[i].r)-getsum(qu[i].l-1);
}
for(int i=0;i<q;i++) printf("%I64d\n",ans[i]);
}
return 0;
}