結果
| 問題 |
No.875 Range Mindex Query
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2021-04-11 02:47:28 |
| 言語 | Kuin (KuinC++ v.2021.9.17) |
| 結果 |
AC
|
| 実行時間 | 282 ms / 2,000 ms |
| コード長 | 1,728 bytes |
| コンパイル時間 | 2,287 ms |
| コンパイル使用メモリ | 148,316 KB |
| 実行使用メモリ | 6,944 KB |
| 最終ジャッジ日時 | 2024-09-16 12:30:54 |
| 合計ジャッジ時間 | 6,461 ms |
|
ジャッジサーバーID (参考情報) |
judge6 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 18 |
ソースコード
func main()
var n: int :: cui@inputInt()
var q: int :: cui@inputInt()
var seg: @SegmentTree :: (#@SegmentTree).init(n)
var a: []int :: #[n]int
for i(0, n - 1)
do a[i] :: cui@inputInt() - 1
do seg.update(i, a[i] * n + i)
end for
for(1, q)
var type: int :: cui@inputInt()
var l: int :: cui@inputInt() - 1
var r: int :: cui@inputInt() - 1
if(type = 1)
var t: int :: a[l]
do a[l] :: a[r]
do a[r] :: t
do seg.update(l, a[l] * n + l)
do seg.update(r, a[r] * n + r)
else
var idxVal: int :: seg.query(l, r + 1)
var idx: int :: idxVal % n
do cui@print("\{idx + 1}\n")
end if
end for
end func
class SegmentTree()
const inf_: int :: lib@intMax
var size: int
var node: []int
+func init(n: int): SegmentTree
do me.size :: 1
while(me.size < n)
do me.size :* 2
end while
do me.node :: #[2 * me.size]int
for i(0, 2 * me.size - 1)
do me.node[i] :: inf_
end for
ret me
end func
+func update(idx: int, val: int)
do idx :+ me.size - 1
do me.node[idx] :: val
while(idx > 0)
do idx :: (idx - 1) / 2
do me.node[idx] :: lib@min(me.node[2 * idx + 1], me.node[2 * idx + 2])
end while
end func
+func query(a: int, b: int): int
ret me.querySub(a, b, 0, 0, me.size)
end func
func querySub(a: int, b: int, k: int, l: int, r: int): int
if(b <= l | r <= a)
ret inf_
end if
if(a <= l & r <= b)
ret me.node[k]
end if
var vl: int :: me.querySub(a, b, 2 * k + 1, l, (l + r) / 2)
var vr: int :: me.querySub(a, b, 2 * k + 2, (l + r) / 2, r)
ret lib@min(vl, vr)
end func
+*func toStr(): []char
var res: []char :: ""
for i(0, 2 * me.size - 1)
do res :~ "\{me.node[i]}" ~ (i = me.size - 1 ?("\n", " "))
end for
ret res
end func
end class