結果
問題 |
No.2650 [Cherry 6th Tune *] セイジャク
|
ユーザー |
![]() |
提出日時 | 2024-02-23 21:44:10 |
言語 | Crystal (1.14.0) |
結果 |
TLE
|
実行時間 | - |
コード長 | 1,840 bytes |
コンパイル時間 | 13,382 ms |
コンパイル使用メモリ | 300,736 KB |
実行使用メモリ | 22,048 KB |
最終ジャッジ日時 | 2024-09-29 06:04:12 |
合計ジャッジ時間 | 20,423 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 2 |
other | AC * 2 TLE * 1 -- * 28 |
ソースコード
n, a = read_line.split.map(&.to_i) x = read_line.split.map(&.to_i) t = read_line.to_i lrs = Array.new(t) { read_line.split.map(&.to_i) } coords = x.dup lrs.each { |lr| coords += lr } c2i = Hash(Int32, Int32).new coords.sort.uniq.each.with_index do |c, i| c2i[c] = i end segtree = RangeSetSegTree(Int32).new(Array.new(coords.size, -1), ->(x : Int32, y : Int32) { {x, y}.max }, 0) lrs.each.with_index do |lr, i| l, r = lr.map { |x| c2i[x] } segtree.set(l, r + 1, i + 1) end n.times do |i| ans = segtree.get(c2i[x[i]]) puts ans <= 0 ? -1 : ans end class RangeSetSegTree(T) @ar : Array(T) @size : Int32 @op : Proc(T, T, T) @zero : T def initialize(s : Int32, @op : Proc(T, T, T), @zero : T) @size = 1 while @size < s @size *= 2 end @ar = Array.new(@size * 2, @zero) end def initialize(init : Array(T), @op : Proc(T, T, T), @zero : T) @size = 1 while @size < init.size @size *= 2 end @ar = Array.new(@size, @zero) @ar.concat(init) @ar.concat([@zero] * (@size - init.size)) (@size - 1).downto(1) do |i| @ar[i] = @op.call(@ar[i * 2], @ar[i * 2 + 1]) end end def get(pos : Int32) ret = @zero bit = 1 base = @size while base > 0 ret = @op.call(ret, @ar[base + (pos >> (bit - 1))]) bit += 1 base >>= 1 end return ret end def set(lo : Int32, hi : Int32, v : T) # [lo, hi) bit = @size.trailing_zeros_count len = @size base = 1 while len > 0 nlo = (lo + len - 1) & ~(len - 1) phi = hi & ~(len - 1) if nlo + len <= hi i = base + (nlo >> bit) @ar[i] = @op.call(v, @ar[i]) end if lo <= phi - len i = base + (phi >> bit) - 1 @ar[i] = @op.call(v, @ar[i]) end bit -= 1 len >>= 1 base <<= 1 end end end