結果
問題 | No.1558 Derby Live |
ユーザー |
|
提出日時 | 2021-06-27 23:23:50 |
言語 | Kuin (KuinC++ v.2021.9.17) |
結果 |
AC
|
実行時間 | 638 ms / 2,000 ms |
コード長 | 3,306 bytes |
コンパイル時間 | 3,306 ms |
コンパイル使用メモリ | 148,160 KB |
実行使用メモリ | 10,112 KB |
最終ジャッジ日時 | 2024-09-16 12:38:34 |
合計ジャッジ時間 | 19,434 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 33 |
ソースコード
func main()var n: int :: cui@inputInt()var m: int :: cui@inputInt()var q: int :: cui@inputInt()var seg: @SegmentTree :: (#@SegmentTree).init(m)for(1, q)var type: int :: cui@inputInt()switch(type)case 1var d: int :: cui@inputInt() - 1var p: []int :: #[n]intfor i(0, n - 1)do p[i] :: cui@inputInt()end fordo seg.update(d, (#@Data).init(p))case 2var s: int :: cui@inputInt()var data: @Data :: seg.query(0, s)for rank(1, n)for i(0, n - 1)if(data.data[i] = rank)do cui@print("\{i + 1}" ~ (rank = n ?("\n", " ")))break iend ifend forend forcase 3var l: int :: cui@inputInt() - 1var r: int :: cui@inputInt()var data: @Data :: seg.query(l, r)var sum: int :: 0for i(0, n - 1)do sum :+ (data.data[i] - 1 - i).abs()end fordo cui@print("\{sum}\n")end switchend forend funcclass SegmentTree()var size: intvar node: []@Datavar lasy: []@Data+func init(n: int): SegmentTreedo me.size :: 1while(me.size < n)do me.size :* 2end whiledo me.node :: #[2 * me.size]@Datado me.lasy :: ##me.noderet meend funcfunc eval(k: int)if(me.lasy[k] =& null)retend ifif(k < me.size - 1)do me.lasy[k * 2 + 1] :: me.lasy[k]do me.lasy[k * 2 + 2] :: me.lasy[k]end ifdo me.node[k] :: me.lasy[k]do me.lasy[k] :: nullend func+func update(idx: int, val: @Data)do me.updateRange(idx, idx + 1, val)end func+func updateRange(a: int, b: int, val: @Data)do me.updateRangeSub(a, b, val, 0, 0, me.size)end func+func updateRangeSub(a: int, b: int, val: @Data, k: int, l: int, r: int)do me.eval(k)if(a <= l & r <= b)do me.lasy[k] :: valdo me.eval(k)elif(a < r & l < b)do me.updateRangeSub(a, b, val, k * 2 + 1, l, (l + r) / 2)do me.updateRangeSub(a, b, val, k * 2 + 2, (l + r) / 2, r)do me.node[k] :: me.op(me.node[k * 2 + 1], me.node[k * 2 + 2])end ifend func+func query(a: int, b: int): @Dataret me.querySub(a, b, 0, 0, me.size)end funcfunc querySub(a: int, b: int, k: int, l: int, r: int): @Datado me.eval(k)if(b <= l | r <= a)ret nullend ifif(a <= l & r <= b)ret me.node[k]end ifvar vl: @Data :: me.querySub(a, b, 2 * k + 1, l, (l + r) / 2)var vr: @Data :: me.querySub(a, b, 2 * k + 2, (l + r) / 2, r)ret me.op(vl, vr)end func+*func toStr(): []charvar padding: int :: 1while(padding <= me.size)do padding :* 2end whiledo padding :- 1var res: []char :: ""var s: int :: 0var e: int :: 0var n: int :: 1const digit: int :: 7var strNull: []char :: " ".repeat(digit - 6) ~ "invalid"while(padding > 0)do padding :/ 2for i(s, e)do res :~ " ".repeat((digit + 1) * padding)do res :~ "\{me.node[i] =& null ?("null", me.node[i].toStr())}|"end fordo res :~ "\n"do n :* 2do s :: e + 1do e :: s + n - 1end whileret resend funcfunc op(d1: @Data, d2: @Data): @Dataif(d1 =& null)ret ##d2elif(d2 =& null)ret ##d1end ifvar res: @Data :: ##d1for i(0, ^d1.data - 1)do res.data[i] :: d2.data[d1.data[i] - 1]end forret resend funcend classclass Data()+var data: []int+func init(arr: []int): Datado me.data :: arrret meend funcend class