/
5223.test.cpp
85 lines (72 loc) · 1.77 KB
/
5223.test.cpp
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
73
74
75
76
77
78
79
80
81
82
83
84
85
// verification-helper: PROBLEM https://yukicoder.me/problems/5223
#include<bits/stdc++.h>
using namespace std;
#define call_from_test
#include "../../algorithm/mo.cpp"
#include "../../segtree/basic/lazy.cpp"
#include "../../datastructure/binaryindexedtree.cpp"
#undef call_from_test
signed main(){
cin.tie(0);
ios::sync_with_stdio(0);
const char newl = '\n';
int n,q;
cin>>n>>q;
vector<int> as(n);
for(int i=0;i<n;i++) cin>>as[i];
auto f=[&](int a,int b){return min(a,b);};
auto g=[&](int a,int b){return a+b;};
int ti(1e9),ei(0);
SegmentTree<int, int> seg(f,g,g,ti,ei);
seg.build(vector<int>(n+2,0));
BIT<int> bitL(n+2),bitR(n+2);
using ll = long long;
ll res=0;
auto expandL=[&](int i){
res-=bitL.query(as[i]+1,n+2);
res-=bitR.query(0,as[i]);
bitL.add(as[i],-1);
seg.update(0,as[i],-1);
};
auto expandR=[&](int i){
res-=bitL.query(as[i]+1,n+2);
res-=bitR.query(0,as[i]);
bitR.add(as[i],-1);
seg.update(as[i]+1,n+2,-1);
};
auto shrinkL=[&](int i){
res+=bitL.query(as[i]+1,n+2);
res+=bitR.query(0,as[i]);
bitL.add(as[i],+1);
seg.update(0,as[i],+1);
};
auto shrinkR=[&](int i){
res+=bitL.query(as[i]+1,n+2);
res+=bitR.query(0,as[i]);
bitR.add(as[i],+1);
seg.update(as[i]+1,n+2,+1);
};
for(int i=n-1;i>=0;i--){
res+=bitR.query(0,as[i]);
bitR.add(as[i],+1);
seg.update(as[i]+1,n+2,+1);
}
Mo mo(n,200,expandL,expandR,shrinkL,shrinkR);
vector<int> ls,rs;
for(int i=0;i<q;i++){
int l,r;
cin>>l>>r;
l--;
ls.emplace_back(l);
rs.emplace_back(r);
mo.add(l,r);
}
mo.build();
vector<ll> ans(q,0);
for(int i=0;i<q;i++){
int k=mo.process();
ans[k]=(rs[k]-ls[k])*seg.query(0,n+2)+res;
}
for(int i=0;i<q;i++) cout<<ans[i]<<newl;
return 0;
}