Submission #57098548


Source Code Expand

Copy
class BIT
attr_accessor(:arr, :size)
def initialize(n)
@size = n
@arr = Array.new(@size+1,0)
end
def add(i,x)
while i <= @size
@arr[i] += x
i += i & -i
end
end
def sum(i)
sum = 0
while i > 0
sum += @arr[i]
i &= i - 1
end
sum
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
class BIT
  attr_accessor(:arr, :size)
  def initialize(n)
    @size = n
    @arr = Array.new(@size+1,0)
  end

  def add(i,x)
    while i <= @size
      @arr[i] += x
      i += i & -i
    end
  end

  def sum(i)
    sum = 0
    while i > 0
      sum += @arr[i]
      i &= i - 1
    end
    sum
  end

  def lower_bound(x) #「bitがx個立っているところ」を指す!bsearchの代わりに
    return -1 if x <= 0
    ret = -1
    k = 1
    k <<= 1 while 2*k <= @size
    while k > 0
        if ret+k < @size && @arr[ret+k+1] < x
            x -= @arr[ret+k+1]
            ret += k
        end
        k >>= 1
    end
    ret + 2
  end

end

n = gets.to_i
a = gets.split.map(&:to_i)
b = gets.split.map(&:to_i)

bit_a = BIT.new(n+1)
bit_b = BIT.new(n+1)
n.times do |i|
  bit_a.add(i+1,a[i])
  bit_b.add(i+1,1) if b[i] >= 2
end

q = gets.to_i
memo = {}
q.times do
  query = gets.split.map(&:to_i)
  if query[0] == 1
    i,x = query[1..]
    bit_a.add(i,x-a[i-1])
    a[i-1] = x
    memo = {}
  elsif query[0] == 2
    i,x = query[1..]
    if b[i-1] == 1 && x != 1
      bit_b.add(i,1)
    elsif b[i-1] != 1 && x == 1
      bit_b.add(i,-1)
    end
    b[i-1] = x
    memo = {}
  else
    l,r = query[1..]
    if memo[[l,r]]
      puts memo[[l,r]]
    else
      sum = 0
      left = l
      right = r+1
      while left < right
        if sum+a[left-1] < sum*b[left-1]
          sum *= b[left-1]
        else
          sum += a[left-1]
        end
        left_bit_count = bit_b.sum(left)
        next_left = bit_b.lower_bound(left_bit_count+1)
        next_left = right if next_left >= right
        sum += bit_a.sum(next_left-1) - bit_a.sum(left)
        left = next_left
      end
      memo[[l,r]] = sum
      puts sum
    end
  end
end

Submission Info

Submission Time
Task G - Add and Multiply Queries
User konayuki
Language Ruby (ruby 3.2.2)
Score 575
Code Size 1839 Byte
Status AC
Exec Time 1861 ms
Memory 32740 KB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 575 / 575
Status
AC × 2
AC × 41
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt
All 00_sample_00.txt, 00_sample_01.txt, 01_internal_00.txt, 01_internal_01.txt, 01_internal_02.txt, 01_internal_03.txt, 01_internal_04.txt, 01_internal_05.txt, 01_internal_06.txt, 01_internal_07.txt, 01_internal_08.txt, 01_internal_09.txt, 01_internal_10.txt, 01_internal_11.txt, 01_internal_12.txt, 01_internal_13.txt, 01_internal_14.txt, 01_internal_15.txt, 01_internal_16.txt, 01_internal_17.txt, 01_internal_18.txt, 01_internal_19.txt, 01_internal_20.txt, 01_internal_21.txt, 01_internal_22.txt, 01_internal_23.txt, 01_internal_24.txt, 01_internal_25.txt, 01_internal_26.txt, 01_internal_27.txt, 01_internal_28.txt, 01_internal_29.txt, 01_internal_30.txt, 01_internal_31.txt, 01_internal_32.txt, 01_internal_33.txt, 01_internal_34.txt, 01_internal_35.txt, 01_internal_36.txt, 01_internal_37.txt, 01_internal_38.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 99 ms 17048 KB
00_sample_01.txt AC 44 ms 17392 KB
01_internal_00.txt AC 258 ms 19672 KB
01_internal_01.txt AC 238 ms 17884 KB
01_internal_02.txt AC 1773 ms 28396 KB
01_internal_03.txt AC 1762 ms 28200 KB
01_internal_04.txt AC 1777 ms 28284 KB
01_internal_05.txt AC 1822 ms 28584 KB
01_internal_06.txt AC 1827 ms 28272 KB
01_internal_07.txt AC 1812 ms 28344 KB
01_internal_08.txt AC 1828 ms 28220 KB
01_internal_09.txt AC 1797 ms 28428 KB
01_internal_10.txt AC 1835 ms 28276 KB
01_internal_11.txt AC 1811 ms 28552 KB
01_internal_12.txt AC 312 ms 27876 KB
01_internal_13.txt AC 313 ms 27312 KB
01_internal_14.txt AC 312 ms 28288 KB
01_internal_15.txt AC 382 ms 26908 KB
01_internal_16.txt AC 385 ms 27896 KB
01_internal_17.txt AC 381 ms 28084 KB
01_internal_18.txt AC 1422 ms 31924 KB
01_internal_19.txt AC 1421 ms 32256 KB
01_internal_20.txt AC 1450 ms 32640 KB
01_internal_21.txt AC 1395 ms 32600 KB
01_internal_22.txt AC 1352 ms 32244 KB
01_internal_23.txt AC 1392 ms 31980 KB
01_internal_24.txt AC 1422 ms 32396 KB
01_internal_25.txt AC 1440 ms 32740 KB
01_internal_26.txt AC 1471 ms 32692 KB
01_internal_27.txt AC 1427 ms 32360 KB
01_internal_28.txt AC 324 ms 28884 KB
01_internal_29.txt AC 1844 ms 28248 KB
01_internal_30.txt AC 1766 ms 28132 KB
01_internal_31.txt AC 1790 ms 28212 KB
01_internal_32.txt AC 1828 ms 28444 KB
01_internal_33.txt AC 1747 ms 28244 KB
01_internal_34.txt AC 1861 ms 28276 KB
01_internal_35.txt AC 1769 ms 28188 KB
01_internal_36.txt AC 1830 ms 28332 KB
01_internal_37.txt AC 1800 ms 28136 KB
01_internal_38.txt AC 1752 ms 28148 KB


2025-04-18 (Fri)
22:10:15 +00:00