結果

問題 No.151 セグメントフィッシング
コンテスト
ユーザー cologne
提出日時 2026-01-28 17:06:38
言語 PyPy3
(7.3.17)
結果
AC  
実行時間 231 ms / 5,000 ms
コード長 3,188 bytes
記録
記録タグの例:
初AC ショートコード 純ショートコード 純主流ショートコード 最速実行時間
コンパイル時間 268 ms
コンパイル使用メモリ 82,712 KB
実行使用メモリ 82,576 KB
最終ジャッジ日時 2026-01-28 17:06:44
合計ジャッジ時間 4,341 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 5
other AC * 19
権限があれば一括ダウンロードができます

ソースコード

diff #
raw source code

import sys

from typing import List, Tuple


def int1(x: str, /): return int(x) - 1


def input(): return sys.stdin.readline().rstrip('\n')


def dbg(*args, **kwargs):
    print(*(repr(arg) for arg in args), *(f'{k}: {repr(v)}' for k, v in kwargs.items()), sep='; ', file=sys.stderr)


import abc, typing

T = typing.TypeVar('T')


class SegTree(typing.Generic[T], metaclass=abc.ABCMeta):

    @staticmethod
    @abc.abstractmethod
    def e() -> T:
        raise NotImplementedError

    @staticmethod
    @abc.abstractmethod
    def op(a: T, b: T) -> T:
        raise NotImplementedError

    def __len__(self):
        return self._n

    def __init__(self, param: typing.Union[int, typing.Iterable[T]]):
        if type(param) == int:
            self._n = param
        else:
            if type(param) != list:
                param = list(param)
            self._n = len(param)
        if self._n == 0:
            return
        self._lg = (self._n - 1).bit_length()
        self._arr = [self.e()] * (2 << self._lg)
        if type(param) != int:
            self._arr[1 << self._lg:(1 << self._lg) + self._n] = param
            for i in range((1 << self._lg) - 1, 0, -1):
                self._arr[i] = self.op(self._arr[i << 1], self._arr[(i << 1) | 1])

    def set(self, i: int, v: T):
        assert 0 <= i < self._n
        i += 1 << self._lg
        self._arr[i] = v
        for h in range(1, self._lg + 1):
            j = i >> h
            self._arr[j] = self.op(self._arr[j << 1], self._arr[(j << 1) | 1])

    def get(self, i: int):
        assert 0 <= i < self._n
        return self._arr[i + (1 << self._lg)]

    def prod(self, l: int, r: int):
        assert 0 <= l <= r <= self._n
        l, r = (1 << self._lg) + l, (1 << self._lg) + r
        sml = smr = self.e()
        while l < r:
            if l & 1:
                sml = self.op(sml, self._arr[l])
                l += 1
            if r & 1:
                r -= 1
                smr = self.op(smr, self._arr[r])
            l, r = l >> 1, r >> 1
        return self.op(sml, smr)


class SumSegTree(SegTree[int]):
    @staticmethod
    def e():
        return 0

    @staticmethod
    def op(a, b):
        return a + b


def main():
    n, q = map(int, input().split())
    s = SumSegTree(2 * n)
    for t in range(1, q + 1):
        x, y, z = input().split()
        y, z = int(y), int(z)
        if x == 'R':
            pos = (y - t) % (2 * n)
            orig = s.get(pos)
            s.set(pos, orig + z)
        elif x == 'L':
            pos = (2 * n - 1 - y - t) % (2 * n)
            orig = s.get(pos)
            s.set(pos, orig + z)
        else:
            def get(fr, to):
                if fr // (2 * n) != to // (2 * n):
                    return s.prod(fr % (2 * n), 2 * n) + s.prod(0, to % (2 * n))
                else:
                    return s.prod(fr % (2 * n), to % (2 * n))

            print(get(y - t, z - t) + get(2 * n - z - t, 2 * n - y - t))


def _start():
    ret = main()

    if ret is not None:
        if isinstance(ret, List) or isinstance(ret, Tuple):
            print(*ret)
        else:
            print(ret)


if __name__ == '__main__':
    _start()
0