結果

問題 No.3265 地元に帰れば天才扱い!
ユーザー fungsi
提出日時 2025-09-08 21:58:07
言語 Crystal
(1.14.0)
結果
RE  
実行時間 -
コード長 1,988 bytes
コンパイル時間 15,433 ms
コンパイル使用メモリ 311,536 KB
実行使用メモリ 14,020 KB
最終ジャッジ日時 2025-09-08 21:58:27
合計ジャッジ時間 18,034 ms
ジャッジサーバーID
(参考情報)
judge / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample RE * 4
other RE * 21
権限があれば一括ダウンロードができます

ソースコード

diff #

n, m = gets.not_nil!.split.map(&.to_i)
segtree0 = Array.new(2 * m, 0_i64)
segtree1 = Array.new(2 * m, 0_i64)
a = Array.new(n, 0_i64)
l_arr = Array.new(n, 0)
r_arr = Array.new(n, 0)
c_arr = Array.new(n, 0)

res = 0_i64

n.times do |i|
  input = gets.not_nil!.split.map(&.to_i)
  a[i] = input[0].to_i64
  l_arr[i] = input[1] - 1
  r_arr[i] = input[2]
  segtree1[m + i] = a[i]
  res += (r_arr[i] - l_arr[i]) * a[i]
  c_arr[i] = i
  
  l = m + l_arr[i]
  r = m + r_arr[i]
  while l < r
    if l.odd?
      segtree0[l] += 1
      l += 1
    end
    if r.odd?
      r -= 1
      segtree0[r] += 1
    end
    l //= 2
    r //= 2
  end
end

(m - 1).downto(1) do |i|
  segtree1[i] = segtree1[i << 1] + segtree1[(i << 1) | 1]
end

n.times do |i|
  l = m + l_arr[i]
  r = m + r_arr[i]
  while l < r
    if l.odd?
      res -= segtree1[l]
      l += 1
    end
    if r.odd?
      r -= 1
      res -= segtree1[r]
    end
    l //= 2
    r //= 2
  end
end

q = gets.not_nil!.to_i
q.times do
  input = gets.not_nil!.split.map(&.to_i)
  i = input[0] - 1
  res -= (r_arr[i] - l_arr[i]) * a[i]
  
  pos = m + c_arr[i]
  while pos > 0
    res += segtree0[pos] * a[i]
    segtree1[pos] -= a[i]
    pos //= 2
  end
  
  l = m + l_arr[i]
  r = m + r_arr[i]
  while l < r
    if l.odd?
      segtree0[l] -= 1
      res += segtree1[l]
      l += 1
    end
    if r.odd?
      r -= 1
      segtree0[r] -= 1
      res += segtree1[r]
    end
    l //= 2
    r //= 2
  end
  
  input = gets.not_nil!.split.map(&.to_i)
  c_arr[i] = input[0] - 1
  l_arr[i] = input[1] - 1
  r_arr[i] = input[2]
  res += (r_arr[i] - l_arr[i]) * a[i]
  
  pos = m + c_arr[i]
  while pos > 0
    res -= segtree0[pos] * a[i]
    segtree1[pos] += a[i]
    pos //= 2
  end
  
  l = m + l_arr[i]
  r = m + r_arr[i]
  while l < r
    if l.odd?
      segtree0[l] += 1
      res -= segtree1[l]
      l += 1
    end
    if r.odd?
      r -= 1
      segtree0[r] += 1
      res -= segtree1[r]
    end
    l //= 2
    r //= 2
  end
  
  puts res
end
0