1 #include<stdio.h> 2 #include<string.h> 3 int ql,qr,p; 4 long long fsum,v; 5 int f[100005],g[100005],a[100005],b[100005]; 6 int r[100005],l[100005],hash[100005],real[100005]; 7 long long ans[100005],sumv[300005]; 8 void mysort(int l,int r) 9 { 10 int i=l,j=r,x=a[(i+j)/2],y; 11 while (i<=j) 12 { 13 while (a[i]<x) i++; 14 while (x<a[j]) j--; 15 if (i<=j) 16 { 17 y=a[i]; a[i]=a[j]; a[j]=y; 18 y=g[i]; g[i]=g[j]; g[j]=y; 19 i++; j--; 20 } 21 } 22 if (i<r) mysort(i,r); 23 if (l<j) mysort(l,j); 24 } 25 void yoursort(int ll,int rr) 26 { 27 int i=ll,j=rr,x=r[(i+j)/2],y; 28 while (i<=j) 29 { 30 while (r[i]<x) i++; 31 while (x<r[j]) j--; 32 if (i<=j) 33 { 34 y=r[i]; r[i]=r[j]; r[j]=y; 35 y=l[i]; l[i]=l[j]; l[j]=y; 36 y=f[i]; f[i]=f[j]; f[j]=y; 37 i++; j--; 38 } 39 } 40 if (ll<j) yoursort(ll,j); 41 if (i<rr) yoursort(i,rr); 42 } 43 void update(int o,int l,int r) 44 { 45 int mid=l+(r-l)/2; 46 if (l==r) sumv[o]=v; 47 else{ 48 if (p<=mid) update(o*2,l,mid); 49 else update(o*2+1,mid+1,r); 50 sumv[o]=sumv[o*2]+sumv[o*2+1]; 51 } 52 } 53 void query(int o,int l,int r) 54 { 55 int mid=l+(r-l)/2; 56 if (ql<=l&&r<=qr) fsum+=sumv[o]; 57 else{ 58 if (ql<=mid) query(o*2,l,mid); 59 if (mid<qr) query(o*2+1,mid+1,r); 60 } 61 } 62 int main() 63 { 64 int T,n,i,m,j; 65 scanf("%d",&T); 66 while (T--) 67 { 68 scanf("%d",&n); 69 for (i=1;i<=n;i++) { scanf("%d",&a[i]); g[i]=i; real[i]=a[i];} 70 mysort(1,n); 71 b[g[1]]=1; 72 for (i=2;i<=n;i++) 73 if (a[i]==a[i-1]) b[g[i]]=b[g[i-1]]; 74 else b[g[i]]=i; 75 memset(hash,0,sizeof(hash)); 76 memset(sumv,0,sizeof(sumv)); 77 scanf("%d",&m); 78 for (i=1;i<=m;i++) {f[i]=i; scanf("%d%d",&l[i],&r[i]); } 79 yoursort(1,m); 80 for (i=1;i<=r[1];i++) 81 { 82 if (hash[b[i]]!=0) 83 { 84 p=hash[b[i]]; v=0; 85 update(1,1,n); 86 } 87 p=i; v=real[i]; 88 update(1,1,n); 89 hash[b[i]]=i; 90 } 91 ql=l[1]; qr=r[1]; fsum=0; 92 query(1,1,n); 93 ans[f[1]]=fsum; 94 for (i=2;i<=m;i++) 95 { 96 for (j=r[i-1]+1;j<=r[i];j++) 97 { 98 if (hash[b[j]]!=0) 99 { 100 p=hash[b[j]]; v=0; 101 update(1,1,n); 102 } 103 p=j; v=real[j]; 104 update(1,1,n); 105 hash[b[j]]=j; 106 } 107 ql=l[i]; qr=r[i]; fsum=0; 108 query(1,1,n); 109 ans[f[i]]=fsum; 110 } 111 for (i=1;i<=m;i++) printf("%I64d\n",ans[i]); 112 } 113 }
转载于:https://www.cnblogs.com/xiao-xin/articles/3867042.html