luogu2709 小b的询问

1
2
3
4
5
6
7
关于排序的速度:
cmp<重载<友元重载(部分数据即实验结果)
莫队裸题
小优化:
对奇数块,r从小到大
对偶数快,r从大到小
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include<bits/stdc++.h>
#define mp make_pair
#define pb push_back
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
inline LL read()
{
LL x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
const int N=50008;
int n,m,k,blk;
int a[N];
int curl,curr;
int tmp,ans[N],cnt[N];
struct node{
int l,r,id;
}q[N];
inline bool cmp(const node &a,const node &b)
{
//return (a.l/blk==b.l/blk)?a.r<b.r:a.l<b.l;
if(a.l/blk!=b.l/blk) return a.l<b.l;
if(a.l/blk%2) return a.r<b.r;
return a.r>b.r;
}
inline void add(int x)
{
tmp+=2*cnt[a[x]]+1;
++cnt[a[x]];
}
inline void remove(int x)
{
tmp-=2*cnt[a[x]]-1;
--cnt[a[x]];
}
int main()
{
n=read();m=read();k=read();
blk=sqrt(n);
for(int i=1;i<=n;++i){
a[i]=read();
}
for(int i=1;i<=m;++i){
q[i].l=read();q[i].r=read();q[i].id=i;
}
sort(q+1,q+m+1,cmp);
curl=1;curr=0;
for(int i=1;i<=m;++i){
while(curl>q[i].l){
add(--curl);
}
while(curr<q[i].r){
add(++curr);
}
while(curl<q[i].l){
remove(curl);
++curl;
}
while(curr>q[i].r){
remove(curr);
--curr;
}
ans[q[i].id]=tmp;
}
for(int i=1;i<=m;++i){
printf("%dn",ans[i]);
}
return 0;
}