为什么将qwq行的注释去掉,答案就不一样了呢?
#include <bits/stdc++.h>
using namespace std;
const int MAXN=50005;
void write(long long ans,bool bk){if(ans<0)putchar('-'),ans=-ans;if(ans==0){if(!bk)putchar('0');return ;}write(ans/10,true);putchar(ans%10^'0');}
void qr(int &ret){int x=0,f=0;char ch=getchar();while(ch<'0'||ch>'9')f|=ch=='-',ch=getchar();while(ch>='0'&&ch<='9')x=(x<<3)+(x<<1)+(ch^48),ch=getchar();ret=f?-x:x;}
struct node{
int l,r,id,cl;
}p[MAXN];
bool cmp(node x,node y){
return x.cl==y.cl?(x.cl&1?x.r<y.r:x.r>y.r):x.l<y.l;
}
int a[MAXN],cnt[MAXN];
long long ans[MAXN];
int main() {
int n,m,s,k;
long long tot;
qr(n);
qr(m);
qr(k);
s=sqrt(n);
for(int i=1;i<=n;++i){
qr(a[i]);
}
for(int i=1;i<=m;++i){
qr(p[i].l),qr(p[i].r);
p[i].cl=(p[i].l+s-1)/s;
p[i].id=i;
}
sort(p+1,p+m+1,cmp);
int l=1,r=0;
for(int i=1;i<=m;++i){
// cout << p[i].l << " " << p[i].r << endl;//qwq
while(r<p[i].r) tot+=2*cnt[a[++r]]+++1;
while(r>p[i].r) tot-=2*cnt[a[r--]]---1;
while(l>p[i].l) tot+=2*cnt[a[--l]]+++1;
while(l<p[i].l) tot-=2*cnt[a[l++]]---1;
ans[p[i].id]=tot;
}
for(int i=1;i<=m;++i){
write(ans[i],false);
putchar('\n');
}
return 0;
}