結果
| 問題 | 
                            No.1705 Mode of long array
                             | 
                    
| コンテスト | |
| ユーザー | 
                             | 
                    
| 提出日時 | 2021-11-30 09:05:44 | 
| 言語 | Ruby  (3.4.1)  | 
                    
| 結果 | 
                             
                                TLE
                                 
                             
                            
                         | 
                    
| 実行時間 | - | 
| コード長 | 2,909 bytes | 
| コンパイル時間 | 395 ms | 
| コンパイル使用メモリ | 7,296 KB | 
| 実行使用メモリ | 52,096 KB | 
| 最終ジャッジ日時 | 2024-07-03 01:25:58 | 
| 合計ジャッジ時間 | 14,173 ms | 
| 
                            ジャッジサーバーID (参考情報)  | 
                        judge1 / judge3 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 30 TLE * 1 -- * 20 | 
コンパイルメッセージ
Syntax OK
ソースコード
class BinaryTree
  attr_accessor :root
  def initialize
    self.root  = nil
  end
  class Node
    attr_accessor :parent, :left, :right, :value
    def initialize(value)
      self.value  = value
      self.parent = nil
      self.left   = nil
      self.right  = nil
    end
  end
  def insert(value)
    node = Node.new(value)
    parent = root
    point = nil
    while parent != nil
      point = parent
      parent = if (point.value <=> node.value) > 0
        point.left
      else
        point.right
      end
    end
    if point != nil
      node.parent = point
      if (point.value <=> node.value) > 0
        point.left = node
      else
        point.right = node
      end
    else
      self.root = node
    end
  end
  def min(node = root)
    node = node.left while node != nil && node.left != nil
    return node
  end
  def max(node = root)
    node = node.right while node != nil && node.right != nil
    return node
  end
  def successor(node)
    return min(node.right) if node.right != nil
    parent = node.parent
    while parent != nil && parent.right.value == node.value
      node   = parent
      parent = parent.parent
    end
    parent
  end
  def search(value)
    node = root
    while node != nil && node.value != value
      node = if (node.value <=> value) > 0
        node.left
      else
        node.right
      end
    end
    node
  end
  def transplant(out_node, node)
    if out_node == root
      out_node.right.parent = node if out_node.right != nil
      out_node.left.parent = node if out_node.left != nil
    else
      if out_node.parent.left == out_node
        out_node.parent.left = node
      else
        out_node.parent.right = node
      end
    end
    node.parent = out_node.parent if node != nil
  end
  def delete(node)
    if node.left == nil
      transplant(node, node.right)
      self.root = node.right if node.parent == nil
    elsif node.right == nil
      transplant(node, node.left)
      self.root = node.left if node.parent == nil
    else
      suc = successor(node)
      if suc.parent != node
        transplant(suc, suc.right)
        suc.right = node.right
        suc.right.parent = suc
      end
      transplant(node, suc)
      suc.left = node.left
      suc.left.parent = suc
      self.root = suc if node.parent == nil
    end
  end
end
N, M = gets.split(" ").map{|s| s.to_i}
a = gets.split(" ").map{|s| s.to_i}
tree = BinaryTree.new
hash = {}
a.each_with_index {|x, i|
	hash[i+1] = x
	tree.insert([x, i+1])
}
Q = gets.to_i
q = []
Q.times {
	q << gets.split(" ").map{|s| s.to_i}
}
q.each {|t, x, y|
	if t == 1 then
		v = hash[x]
		hash[x] = v + y
		node = tree.search([v, x])
		tree.delete(node)
		tree.insert([v + y, x])
	elsif t == 2 then
		v = hash[x]
		hash[x] = v - y
		node = tree.search([v, x])
		tree.delete(node)
		tree.insert([v - y, x])
	else
		max = tree.max
		puts max.value[1]
	end
}