#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 20005;
const ll mod=1e9+7;
ll a[maxn];
ll s[2][maxn];
ll ans[maxn];
struct note{
int l,r,i,yuan;
bool operator < (const note & x)
{
if (i!=x.i)
return i<x.i;
return r<x.r;
}
}sem[maxn];
void add(int i,int pos,int val)
{
for (int q=pos;q<=maxn-5;q+=q&-q)
s[i][q]+=val;
}
ll gets(int i,int pos)
{
ll sum=0;
for (int q=pos;q;q-=q&-q) sum+=s[i][q];
return sum;
}
int main()
{
int T;
cin>>T;
int n,m;
while (T--)
{
memset(s,0,sizeof s);
memset(ans,0,sizeof ans);
scanf("%d%d",&n,&m);
for (int q=1;q<=n;q++) scanf("%d",&a[q]);
int t1,t2;
int block = sqrt(n);
for (int q=1;q<=m;q++)
{
scanf("%d%d",&sem[q].l,&sem[q].r);
sem[q].i=sem[q].r/block;
sem[q].yuan=q;
}
sort(sem+1,sem+1+m);
int l=1,r=0;
ll temp=0;
for (int q=1;q<=m;q++)
{
while (r<sem[q].r)
{
r++;
add(0,a[r],1);
add(1,a[r],a[r]);
temp+=a[r]*(r-l+1-gets(0,a[r]))+gets(1,a[r]);
}
while (r>sem[q].r)
{
temp-=a[r]*(r-l+1-gets(0,a[r]))+gets(1,a[r]);
add(0,a[r],-1);
add(1,a[r],-a[r]);
r--;
}
while (l<sem[q].l)
{
temp-=a[l]*(r-l+1-gets(0,a[l]))+gets(1,a[l]);
add(0,a[l],-1);
add(1,a[l],-a[l]);
l++;
}
while (l>sem[q].l)
{
l--;
add(0,a[l],-1);
add(1,a[l],-a[l]);
temp-=a[l]*(r-l+1-gets(0,a[l]))+gets(1,a[l]);
}
ans[sem[q].yuan]=temp;
}
for (int q=1;q<=m;q++)
printf("%lld\n",ans[q]);
}
return 0;
}
得分0分。。。。。,已经改到崩溃了,求巨巨看一下!!
已解决。。。。区间左端修改时写错 了。。。,结构体里面重载的< 手残也写错了, 打扰各位了