結果

問題 No.1982 [Cherry 4th Tune B] 絶険
ユーザー lam6er
提出日時 2025-04-15 22:15:48
言語 PyPy3
(7.3.15)
結果
TLE  
実行時間 -
コード長 2,377 bytes
コンパイル時間 304 ms
コンパイル使用メモリ 81,596 KB
実行使用メモリ 574,984 KB
最終ジャッジ日時 2025-04-15 22:18:02
合計ジャッジ時間 13,176 ms
ジャッジサーバーID
(参考情報)
judge4 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 5 TLE * 1 MLE * 1 -- * 28
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys
sys.setrecursionlimit(1 << 25)

class Node:
    __slots__ = ['left', 'right', 'delta']
    def __init__(self, left=None, right=None, delta=0):
        self.left = left
        self.right = right
        self.delta = delta

def build(a, b):
    if a == b:
        return Node()
    mid = (a + b) // 2
    left = build(a, mid)
    right = build(mid+1, b)
    return Node(left, right)

def update(node, a, b, l, r, delta):
    if b < l or a > r:
        return node
    new_node = Node(node.left, node.right, node.delta)
    if l <= a and b <= r:
        new_node.delta += delta
        return new_node
    mid = (a + b) // 2
    new_node.left = update(new_node.left, a, mid, l, r, delta)
    new_node.right = update(new_node.right, mid+1, b, l, r, delta)
    return new_node

def query(node, a, b, x):
    if a == b:
        return node.delta
    mid = (a + b) // 2
    res = node.delta
    if x <= mid:
        res += query(node.left, a, mid, x)
    else:
        res += query(node.right, mid+1, b, x)
    return res

def main():
    import sys
    input = sys.stdin.read().split()
    ptr = 0
    N = int(input[ptr])
    ptr +=1
    K = int(input[ptr])
    ptr +=1
    Q = int(input[ptr])
    ptr +=1

    operations = []
    for _ in range(K):
        L = int(input[ptr])
        ptr +=1
        R = int(input[ptr])
        ptr +=1
        C = int(input[ptr])
        ptr +=1
        H = int(input[ptr])
        ptr +=1
        operations.append( (L, R, C, H) )

    if N ==0:
        versions = []
    else:
        versions = [build(1, N)]
        for L, R, C, H in operations:
            new_root = update(versions[-1], 1, N, L, R, H)
            versions.append(new_root)

    for _ in range(Q):
        I = int(input[ptr])
        ptr +=1
        X = int(input[ptr])
        ptr +=1
        T = X - 0.5
        if K ==0:
            print(-1)
            continue
        sum_total = query(versions[K], 1, N, I)
        if sum_total < T:
            print(-1)
            continue
        low = 1
        high = K
        ans = K
        while low <= high:
            mid = (low + high) // 2
            current_sum = query(versions[mid], 1, N, I)
            if current_sum >= T:
                ans = mid
                high = mid -1
            else:
                low = mid +1
        print(operations[ans-1][2])

if __name__ == "__main__":
    main()
0