forked from EndlessCheng/codeforces-go
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path522D.go
97 lines (87 loc) · 1.61 KB
/
522D.go
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
86
87
88
89
90
91
92
93
94
95
96
97
package main
import (
"bufio"
. "fmt"
"io"
)
// https://space.bilibili.com/206214
type seg22 []struct{ l, r, val int }
func (t seg22) build(o, l, r int) {
t[o].l, t[o].r, t[o].val = l, r, 1e9
if l == r {
return
}
m := (l + r) >> 1
t.build(o<<1, l, m)
t.build(o<<1|1, m+1, r)
}
func (t seg22) update(o, i, val int) {
if t[o].l == t[o].r {
t[o].val = val
return
}
m := (t[o].l + t[o].r) >> 1
if i <= m {
t.update(o<<1, i, val)
} else {
t.update(o<<1|1, i, val)
}
t[o].val = min22(t[o<<1].val, t[o<<1|1].val)
}
func (t seg22) query(o, l, r int) int {
if l <= t[o].l && t[o].r <= r {
return t[o].val
}
m := (t[o].l + t[o].r) >> 1
if r <= m {
return t.query(o<<1, l, r)
}
if m < l {
return t.query(o<<1|1, l, r)
}
return min22(t.query(o<<1, l, r), t.query(o<<1|1, l, r))
}
func CF522D(_r io.Reader, _w io.Writer) {
in := bufio.NewReader(_r)
out := bufio.NewWriter(_w)
defer out.Flush()
var n, m, l, r int
Fscan(in, &n, &m)
a := make([]int, n+1)
for i := 1; i <= n; i++ {
Fscan(in, &a[i])
}
type pair struct{ l, i int }
q := make([][]pair, n+1)
for i := 0; i < m; i++ {
Fscan(in, &l, &r)
q[r] = append(q[r], pair{l, i})
}
ans := make([]int, m)
t := make(seg22, n*4)
t.build(1, 1, n)
last := map[int]int{}
for i := 1; i <= n; i++ {
if p := last[a[i]]; p > 0 {
t.update(1, p, i-p)
}
for _, p := range q[i] {
res := t.query(1, p.l, i)
if res == 1e9 {
res = -1
}
ans[p.i] = res
}
last[a[i]] = i
}
for _, v := range ans {
Fprintln(out, v)
}
}
//func main() { CF522D(os.Stdin, os.Stdout) }
func min22(a, b int) int {
if a > b {
return b
}
return a
}