Skip to content

Commit 3c54f23

Browse files
authored
[20251016] BOJ / P1 / 수열과 쿼리 23 / 권혁준
1 parent 352ec6e commit 3c54f23

File tree

1 file changed

+65
-0
lines changed

1 file changed

+65
-0
lines changed
Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
```cpp
2+
#include <bits/stdc++.h>
3+
using namespace std;
4+
using ll = long long;
5+
6+
int N, Q, a[100000]{}, sq;
7+
ll fen[100001]{}, ans[100000]{};
8+
map<int, int> m;
9+
vector<tuple<int, int, int>> qs;
10+
11+
void upt(int i, int v) {
12+
for(;i<100001;i+=i&-i) fen[i] += v;
13+
}
14+
15+
ll f(int i) {
16+
ll ret = 0;
17+
for(;i>0;i-=i&-i) ret += fen[i];
18+
return ret;
19+
}
20+
21+
int main(){
22+
cin.tie(0)->sync_with_stdio(0);
23+
24+
cin>>N>>Q;
25+
sq = sqrt(N);
26+
for(int i=0;i<N;i++) cin>>a[i], m[a[i]] = 0;
27+
int c = 0;
28+
for(auto &[x,y]:m) y = ++c;
29+
for(int i=0;i<N;i++) a[i] = m[a[i]];
30+
31+
int t = 0;
32+
qs.resize(Q);
33+
for(auto &[a,b,x]:qs) cin>>a>>b, a--, b--, x = t++;
34+
sort(qs.begin(), qs.end(), [](auto a, auto b) -> bool {
35+
auto [al, ar, ax] = a;
36+
auto [bl, br, bx] = b;
37+
if(al/sq == bl/sq) return ar < br;
38+
return al/sq < bl/sq;
39+
});
40+
41+
int l = 0, r = -1;
42+
ll res = 0;
43+
for(auto [pl,pr,x]:qs) {
44+
while(r < pr) {
45+
res += f(c) - f(a[++r]);
46+
upt(a[r],1);
47+
}
48+
while(pr < r) {
49+
res -= f(c) - f(a[r]);
50+
upt(a[r--],-1);
51+
}
52+
while(l < pl) {
53+
res -= f(a[l]-1);
54+
upt(a[l++],-1);
55+
}
56+
while(pl < l) {
57+
res += f(a[--l]-1);
58+
upt(a[l],1);
59+
}
60+
ans[x] = res;
61+
}
62+
for(int i=0;i<Q;i++) cout<<ans[i]<<'\n';
63+
64+
}
65+
```

0 commit comments

Comments
 (0)