結果

問題 No.833 かっこいい電車
ユーザー te-sh
提出日時 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
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

def main(io)
n, q = io.get2
a = 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 do
t, x = io.get2; x -= 1
case t
when 1
s2[x+1] = 0
when 2
s2[x+1] = 1
when 3
s1[x] += 1
when 4
i = s2[..x]
l = (0..x).bsearch { |j| s2[..j] >= i }
r = (x..n).bsearch { |j| s2[..j] > i }
io.put s1[l...r]
end
end
end
class 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_all
end
def 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] = b
propagate_all
end
def [](i : Int)
@buf[i+@an]
end
def [](r : Range)
sc = Indexable.range_to_index_and_count(r, @n)
raise ArgumentError.new("Invalid range") if sc.nil?
start, count = sc
l, r = start + @an, start + count + @an
r1 = r2 = @init
while l != r
if l.odd?
r1 = @compose.call(r1, @buf[l])
l += 1
end
if r.odd?
r -= 1
r2 = @compose.call(@buf[r], r2)
end
l >>= 1
r >>= 1
end
@compose.call(r1, r2)
end
def []=(i : Int, v : T)
@buf[i+@an] = v
propagate(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])
end
end
private def propagate(i : Int)
while (i >>= 1) > 0
@buf[i] = @compose.call(@buf[i << 1], @buf[(i << 1) | 1])
end
end
end
class ProconIO
def initialize
@buf = [] of String
@index = 0
end
def get(k : T.class = Int32) forall T
get_v(k)
end
def get(*ks : T.class) forall T
ks.map { |k| get_v(k) }
end
macro define_getn
{% for i in (2..9) %}
def get{{i}}(k : T.class = Int32) forall T
get({% for j in (1..i) %}k{% if j < i %}, {% end %}{% end %})
end
{% end %}
end
define_getn
def get_a(n : Int, k : T.class = Int32) forall T
Array.new(n) { get_v(k) }
end
def get_c(n : Int, k : T.class = Int32) forall T
get_a(n, k)
end
def get_c(n : Int, *ks : T.class) forall T
a = Array.new(n) { get(*ks) }
ks.map_with_index { |_, i| a.map { |e| e[i] } }
end
macro define_getn_c
{% for i in (2..9) %}
def get{{i}}_c(n : Int, k : T.class = Int32) forall T
get_c(n, {% for j in (1..i) %}k{% if j < i %}, {% end %}{% end %})
end
{% end %}
end
define_getn_c
def get_m(r : Int, c : Int, k : T.class = Int32) forall T
Array.new(r) { get_a(c, k) }
end
def put(*vs)
vs.each.with_index do |v, i|
put_v(v)
print i < vs.size - 1 ? " " : "\n"
end
end
def put_e(*vs)
put(*vs)
exit
end
private def get_v(k : Int32.class); get_token.to_i32; end
private def get_v(k : Int64.class); get_token.to_i64; end
private def get_v(k : String.class); get_token; end
private def get_token
if @buf.size == @index
@buf = read_line.split
@index = 0
end
v = @buf[@index]
@index += 1
v
end
private def put_v(vs : Enumerable)
vs.each_with_index do |v, i|
print v
print " " if i < vs.size - 1
end
end
private def put_v(v)
print v
end
end
main(ProconIO.new)
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0