結果
| 問題 | No.961 Vibrant Fillumination | 
| コンテスト | |
| ユーザー |  gew1fw | 
| 提出日時 | 2025-06-12 21:19:40 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                MLE
                                 
                             | 
| 実行時間 | - | 
| コード長 | 2,185 bytes | 
| コンパイル時間 | 234 ms | 
| コンパイル使用メモリ | 82,264 KB | 
| 実行使用メモリ | 848,460 KB | 
| 最終ジャッジ日時 | 2025-06-12 21:20:04 | 
| 合計ジャッジ時間 | 4,589 ms | 
| ジャッジサーバーID (参考情報) | judge4 / judge1 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 2 | 
| other | MLE * 1 -- * 47 | 
ソースコード
import sys
from bisect import bisect_left, bisect_right
from collections import defaultdict
def main():
    sys.setrecursionlimit(1 << 25)
    input = sys.stdin.read().split()
    ptr = 0
    N = int(input[ptr])
    ptr += 1
    h = list(map(int, input[ptr:ptr + N]))
    ptr += N
    films = []
    for _ in range(N):
        a = int(input[ptr])
        b = int(input[ptr + 1])
        c = int(input[ptr + 2])
        d = int(input[ptr + 3])
        e = int(input[ptr + 4])
        ptr += 5
        a_i = a
        c_end = c - 1
        b_i = b
        d_end = d - 1
        if a_i > c_end or b_i > d_end:
            continue
        films.append((a_i, c_end, b_i, d_end, e))
    events = []
    for idx, (a, c_end, b, d_end, e) in enumerate(films):
        events.append((a, 'add', idx))
        events.append((c_end + 1, 'remove', idx))
    events.sort()
    active = set()
    x_to_active = defaultdict(list)
    current_x = 0
    for event in events:
        x, typ, idx = event
        if x > current_x:
            while current_x < x:
                x_to_active[current_x] = list(active)
                current_x += 1
        if typ == 'add':
            active.add(idx)
        else:
            if idx in active:
                active.remove(idx)
    
    while current_x <= 2 * N:
        x_to_active[current_x] = list(active)
        current_x += 1
    m_trees = {}
    for k in range(0, 2 * N + 1):
        films_at_k = x_to_active.get(k, [])
        intervals = []
        for idx in films_at_k:
            a, c_end, b, d_end, e = films[idx]
            intervals.append((b, d_end, e))
        intervals.sort()
        m_trees[k] = intervals
    Q = int(input[ptr])
    ptr += 1
    for _ in range(Q):
        p = int(input[ptr])
        q = int(input[ptr + 1])
        ptr += 2
        k = p
        m = q
        films_k = x_to_active.get(k, [])
        seen = set()
        xor = 0
        for idx in films_k:
            a, c_end, b, d_end, e = films[idx]
            if b <= m <= d_end:
                if e not in seen:
                    seen.add(e)
                    xor ^= h[e - 1]
        print(xor)
    
if __name__ == "__main__":
    main()
            
            
            
        