結果

問題 No.2421 entersys?
ユーザー miya145592miya145592
提出日時 2023-08-12 14:34:30
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 1,671 ms / 3,000 ms
コード長 2,784 bytes
コンパイル時間 365 ms
コンパイル使用メモリ 82,240 KB
実行使用メモリ 264,396 KB
最終ジャッジ日時 2024-11-19 20:12:53
合計ジャッジ時間 24,726 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 28
権限があれば一括ダウンロードができます

ソースコード

diff #

# https://nagiss.hateblo.jp/entry/2019/07/01/185421
class Bit:
    def __init__(self, n):
        self.size = n
        self.tree = [0]*(n+1)

    def __iter__(self):
        psum = 0
        for i in range(self.size):
            csum = self.sum(i+1)
            yield csum - psum
            psum = csum
        raise StopIteration()

    def __str__(self):  # O(nlogn)
        return str(list(self))

    def sum(self, i):
        # [0, i) の要素の総和を返す
        if not (0 <= i <= self.size): raise ValueError("error!")
        s = 0
        while i>0:
            s += self.tree[i]
            i -= i & -i
        return s

    def add(self, i, x):
        if not (0 <= i < self.size): raise ValueError("error!")
        i += 1
        while i <= self.size:
            self.tree[i] += x
            i += i & -i

    def __getitem__(self, key):
        if not (0 <= key < self.size): raise IndexError("error!")
        return self.sum(key+1) - self.sum(key)

    def __setitem__(self, key, value):
        # 足し算と引き算にはaddを使うべき
        if not (0 <= key < self.size): raise IndexError("error!")
        self.add(key, value - self[key])

import bisect

N = int(input())
XLR = [input().split() for _ in range(N)]
T = set()
X = dict()
for x, l, r in XLR:
    l = int(l)
    r = int(r)
    T.add(l)
    T.add(r)
    if x not in X:
        X[x] = []
    bisect.insort_left(X[x], l)
    bisect.insort_left(X[x], r)

Q = int(input())
query = [input().split() for _ in range(Q)]
for q in query:
    tp = q[0]
    if tp=="1":
        x = q[1]
        t = int(q[2])
        T.add(t)
    elif  tp=="2":
        t = int(q[1])
        T.add(t)
    else:
        x = q[1]
        l = int(q[2])
        r = int(q[3])
        T.add(l)
        T.add(r)

T = list(T)
T.sort()
Z = dict()
for i, t in enumerate(T):
    Z[t] = i

BIT = Bit(len(T)+1)
for x, l, r in XLR:
    l=int(l)
    r=int(r)
    BIT.add(Z[l], 1)
    BIT.add(Z[r]+1, -1)

for q in query:
    tp = q[0]
    if tp=="1":
        x = q[1]
        t = int(q[2])
        if x not in X:
            print("No")
        else:
            pos = bisect.bisect_left(X[x], t)
            if pos==len(X[x]):
                print("No")
            else:
                if pos%2==0:
                    if X[x][pos]==t:
                        print("Yes")
                    else:
                        print("No")
                else:
                    print("Yes")
    elif  tp=="2":
        t = int(q[1])
        ans = BIT.sum(Z[t]+1)
        print(ans)
    else:
        x = q[1]
        l = int(q[2])
        r = int(q[3])
        BIT.add(Z[l], 1)
        BIT.add(Z[r]+1, -1)

        if x not in X:
            X[x] = []
        bisect.insort_left(X[x], l)
        bisect.insort_left(X[x], r)
0