結果
| 問題 |
No.875 Range Mindex Query
|
| コンテスト | |
| ユーザー |
qsako6
|
| 提出日時 | 2019-09-06 23:15:59 |
| 言語 | Ruby (3.4.1) |
| 結果 |
AC
|
| 実行時間 | 1,401 ms / 2,000 ms |
| コード長 | 1,155 bytes |
| コンパイル時間 | 145 ms |
| コンパイル使用メモリ | 7,552 KB |
| 実行使用メモリ | 29,696 KB |
| 最終ジャッジ日時 | 2024-06-24 21:12:07 |
| 合計ジャッジ時間 | 11,486 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 18 |
コンパイルメッセージ
Syntax OK
ソースコード
class RMQ
def initialize(n, inf = (1 << 30) - 1 + (1 << 30))
@n = n, @l = 1, @inf = inf
while @l < n
@l <<= 1
end
@data = Array.new(@l * 2, @inf)
end
def update(i, x)
i += @l
@data[i] = x
i >>= 1
while i > 0
@data[i] = min(@data[i * 2], @data[i * 2 + 1])
i >>= 1
end
true
end
# minimum of [l, r)
def query(l, r)
_query(l, r, 1, 0, @l)
end
def [](k)
@data[@l + k]
end
private
def _query(l, r, k, sl, sr)
return @inf if sr <= l || r <= sl
return @data[k] if l <= sl && sr <= r
dl = _query(l, r, k * 2, sl, (sl + sr) / 2)
dr = _query(l, r, k * 2 + 1, (sl + sr) / 2, sr)
min(dl, dr)
end
def min(a, b)
return (a > b ? b : a)
end
end
h = {}
n, q = gets.split.map(&:to_i)
a = gets.split.map(&:to_i)
rmq = RMQ.new(n)
n.times do |i|
h[a[i]] = i
rmq.update(i, a[i])
end
ans = []
q.times do
c, l, r = gets.split.map(&:to_i)
l -= 1
r -= 1
if c == 1
tmpl = rmq[l]
tmpr = rmq[r]
rmq.update(l, tmpr)
rmq.update(r, tmpl)
h[tmpr] = l
h[tmpl] = r
else
ans << h[rmq.query(l, r + 1)] + 1
end
end
puts ans
qsako6