結果
問題 | No.833 かっこいい電車 |
ユーザー |
|
提出日時 | 2021-07-05 18:18:53 |
言語 | Crystal (1.14.0) |
結果 |
AC
|
実行時間 | 233 ms / 2,000 ms |
コード長 | 3,519 bytes |
コンパイル時間 | 12,148 ms |
コンパイル使用メモリ | 296,856 KB |
実行使用メモリ | 15,972 KB |
最終ジャッジ日時 | 2024-07-01 12:00:54 |
合計ジャッジ時間 | 16,089 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 30 |
ソースコード
def main(io)n, q = io.get2a = io.get_a(n, Int64)s1 = SegmentTree.new(a) { |a, b| a + b }s2 = SegmentTree.new(Array.new(n+1, 1)) { |a, b| a + b }q.times dot, x = io.get2; x -= 1case twhen 1s2[x+1] = 0when 2s2[x+1] = 1when 3s1[x] += 1when 4i = s2[..x]l = (0..x).bsearch { |j| s2[..j] >= i }r = (x..n).bsearch { |j| s2[..j] > i }io.put s1[l...r]endendendclass SegmentTree(T)def initialize(@n : Int32, @init : T = T.zero, &@compose : (T, T) -> T)@an = 1 << (32 - (@n-1).leading_zeros_count)@buf = Array.new(@an*2, @init)propagate_allenddef initialize(b : Array(T), @init : T = T.zero, &@compose : (T, T) -> T)@n = b.size@an = 1 << (32 - (@n-1).leading_zeros_count)@buf = Array.new(@an*2, @init)@buf[@an, @n] = bpropagate_allenddef [](i : Int)@buf[i+@an]enddef [](r : Range)sc = Indexable.range_to_index_and_count(r, @n)raise ArgumentError.new("Invalid range") if sc.nil?start, count = scl, r = start + @an, start + count + @anr1 = r2 = @initwhile l != rif l.odd?r1 = @compose.call(r1, @buf[l])l += 1endif r.odd?r -= 1r2 = @compose.call(@buf[r], r2)endl >>= 1r >>= 1end@compose.call(r1, r2)enddef []=(i : Int, v : T)@buf[i+@an] = vpropagate(i+@an)end@an : Int32@buf : Array(T)private def propagate_all(1...@an).reverse_each do |i|@buf[i] = @compose.call(@buf[i << 1], @buf[(i << 1) | 1])endendprivate def propagate(i : Int)while (i >>= 1) > 0@buf[i] = @compose.call(@buf[i << 1], @buf[(i << 1) | 1])endendendclass ProconIOdef initialize@buf = [] of String@index = 0enddef get(k : T.class = Int32) forall Tget_v(k)enddef get(*ks : T.class) forall Tks.map { |k| get_v(k) }endmacro define_getn{% for i in (2..9) %}def get{{i}}(k : T.class = Int32) forall Tget({% for j in (1..i) %}k{% if j < i %}, {% end %}{% end %})end{% end %}enddefine_getndef get_a(n : Int, k : T.class = Int32) forall TArray.new(n) { get_v(k) }enddef get_c(n : Int, k : T.class = Int32) forall Tget_a(n, k)enddef get_c(n : Int, *ks : T.class) forall Ta = Array.new(n) { get(*ks) }ks.map_with_index { |_, i| a.map { |e| e[i] } }endmacro define_getn_c{% for i in (2..9) %}def get{{i}}_c(n : Int, k : T.class = Int32) forall Tget_c(n, {% for j in (1..i) %}k{% if j < i %}, {% end %}{% end %})end{% end %}enddefine_getn_cdef get_m(r : Int, c : Int, k : T.class = Int32) forall TArray.new(r) { get_a(c, k) }enddef put(*vs)vs.each.with_index do |v, i|put_v(v)print i < vs.size - 1 ? " " : "\n"endenddef put_e(*vs)put(*vs)exitendprivate def get_v(k : Int32.class); get_token.to_i32; endprivate def get_v(k : Int64.class); get_token.to_i64; endprivate def get_v(k : String.class); get_token; endprivate def get_tokenif @buf.size == @index@buf = read_line.split@index = 0endv = @buf[@index]@index += 1vendprivate def put_v(vs : Enumerable)vs.each_with_index do |v, i|print vprint " " if i < vs.size - 1endendprivate def put_v(v)print vendendmain(ProconIO.new)