求调
查看原帖
求调
910357
songzhihan2010楼主2023/9/14 20:52
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5*1e4;
struct node{
	int l,r,pos;
}q[N];
ll now=0;
ll ans[N];
int n,m,k;
int a[N];
int b[N];
int block;
bool cmp(node &a,node &b){
	if((a.l-1)/block==(b.l-1)/block) return a.r<b.r;
	return a.l/block<b.l/block;
}
void add(int t){
	now+=2*b[t]+1;
	b[t]++;
}
void del(int t){
	now-=2*b[t]-1;
	b[t]--;
}
int main(){
	scanf("%d%d%d",&n,&m,&k);
	for (int i=1;i<=n;i++) scanf("%d",&a[i]);
	for (int i=1;i<=m;i++){
		scanf("%d%d",&q[i].l,&q[i].r);
		q[i].pos=i;
	}
	block=sqrt(n);
	int nl=1,nr=0;
	sort(q+1,q+1+m,cmp);
	for (int i=1;i<=m;i++){
		while(nl<q[i].l) del(a[nl]),nl++;
		while(nl>q[i].l) nl--,add(a[nl]);
		while(nr>q[i].r) del(a[nr]),nr--;
		while(nr<q[i].r) nr++,add(a[nr]);
		ans[q[i].pos]=now;
	}
	for (int i=1;i<=m;i++){
		printf("%lld\n",ans[i]);
	}
	return 0;
}
2023/9/14 20:52
加载中...