-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmos_algorithm.py
More file actions
47 lines (38 loc) · 1.01 KB
/
mos_algorithm.py
File metadata and controls
47 lines (38 loc) · 1.01 KB
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
import math
def mos_algorithm(n, arr, queries):
sqrt_n = int(math.sqrt(n))
# 정렬 (Hilbert variant or even/odd variant)
def query_sort_key(q):
l, r, idx = q
block = l // sqrt_n
return (block, r if block % 2 == 1 else -r)
queries.sort(key=query_sort_key)
ans = [0] * len(queries)
cnt = [0] * 1000005
res = 0
def add(idx):
nonlocal res
cnt[arr[idx]] += 1
if cnt[arr[idx]] == 1:
res += 1
def remove(idx):
nonlocal res
cnt[arr[idx]] -= 1
if cnt[arr[idx]] == 0:
res -= 1
l, r = queries[0][0], queries[0][0] - 1
for q_l, q_r, q_idx in queries:
while l > q_l:
l -= 1
add(l)
while r < q_r:
r += 1
add(r)
while l < q_l:
remove(l)
l += 1
while r > q_r:
remove(r)
r -= 1
ans[q_idx] = res
return ans