RT
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <math.h>
#define maxn 50005
using namespace std;
struct node{
int l , r , id;
};
int l = 1 , r , k , m , q, ans , col[maxn] , print[maxn] , be[maxn] , cnt[maxn];
char c;
bool f[maxn];
node que[maxn];
int cmp(node a , node b)
{
return (be[a.l] ^ be[b.l]) ? be[a.l] < be[b.l] : (be[a.l] & 1) ? a.r < b.r : a.r > b.r;
}
int main()
{
scanf("%d %d %d" , &m , &q , &k);
for(int i = 1; i <= m; ++i)
scanf("%d" , &col[i]);
for(int i = 1; i <= q; ++i){
scanf("%d %d" , &que[i].l , &que[i].r);
que[i].id = i;
}
int size = sqrt(m);
int len = ceil((double)m / size);
for(int i = 1; i <= len; ++i){
for(int j = (i - 1) * size + 1; j <= i * size; ++j){
be[j] = i;
}
}
sort(que + 1 , que + 1 + q , cmp);
for(int i = 1; i <= q; ++i){
int ql = que[i].l , qr = que[i].r;
while(l < ql) {--cnt[col[l]] , ans -= 2 * cnt[col[l]] + 1 , ++l;}
while(l > ql) {--l , ++cnt[col[l]]; ans += 2 * cnt[col[l]] - 1;}
while(r < qr) {++r , ++cnt[col[r]] , ans += 2 * cnt[col[r]] - 1;}
while(r > qr) {--cnt[col[r]] , ans -= 2 * cnt[col[r]] + 1 , --r;}
print[que[i].id] = ans;
}
for(int i = 1; i <= q; ++i)
printf("%d\n" , print[i]);
}
网上才看了莫队,兴高采烈的来打了一道,结果wa了,求大佬找错QAQ