結果
| 問題 | No.961 Vibrant Fillumination | 
| コンテスト | |
| ユーザー |  gew1fw | 
| 提出日時 | 2025-06-12 21:21:01 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                WA
                                 
                             | 
| 実行時間 | - | 
| コード長 | 3,052 bytes | 
| コンパイル時間 | 215 ms | 
| コンパイル使用メモリ | 81,996 KB | 
| 実行使用メモリ | 139,712 KB | 
| 最終ジャッジ日時 | 2025-06-12 21:23:43 | 
| 合計ジャッジ時間 | 90,219 ms | 
| ジャッジサーバーID (参考情報) | judge2 / judge4 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 1 WA * 1 | 
| other | WA * 48 | 
ソースコード
import sys
sys.setrecursionlimit(1 << 25)
class SegmentTree:
    def __init__(self, size):
        self.n = 1
        while self.n < size:
            self.n <<= 1
        self.size = self.n
        self.tree = [0] * (2 * self.n)
        self.lazy = [0] * (2 * self.n)
    
    def push(self, node, l, r):
        if self.lazy[node] != 0:
            self.tree[node] ^= self.lazy[node]
            if l != r:
                self.lazy[2*node] ^= self.lazy[node]
                self.lazy[2*node+1] ^= self.lazy[node]
            self.lazy[node] = 0
    
    def range_xor(self, a, b, val, node=1, l=0, r=None):
        if r is None:
            r = self.n - 1
        self.push(node, l, r)
        if a > r or b < l:
            return
        if a <= l and r <= b:
            self.lazy[node] ^= val
            self.push(node, l, r)
            return
        mid = (l + r) // 2
        self.range_xor(a, b, val, 2*node, l, mid)
        self.range_xor(a, b, val, 2*node+1, mid+1, r)
        self.tree[node] = self.tree[2*node] ^ self.tree[2*node+1]
    
    def point_query(self, idx, node=1, l=0, r=None):
        if r is None:
            r = self.n - 1
        self.push(node, l, r)
        if l == r:
            return self.tree[node]
        mid = (l + r) // 2
        if idx <= mid:
            return self.point_query(idx, 2*node, l, mid)
        else:
            return self.point_query(idx, 2*node+1, mid+1, r)
def main():
    import sys
    input = sys.stdin.read
    data = input().split()
    ptr = 0
    N = int(data[ptr])
    ptr += 1
    h = list(map(int, data[ptr:ptr+N]))
    ptr += N
    films = []
    for _ in range(N):
        a = int(data[ptr])
        b = int(data[ptr+1])
        c = int(data[ptr+2])
        d = int(data[ptr+3])
        e = int(data[ptr+4]) - 1  # convert to 0-based
        ptr +=5
        films.append( (a, b, c, d, e) )
    
    max_y = 0
    for a, b, c, d, e in films:
        max_y = max(max_y, d)
    max_y = max(max_y, 2*N -1)
    
    st = SegmentTree(max_y +1)  # since y can be up to 2N-1, size is max_y+1
    events = []
    for i in range(N):
        a, b, c, d, e = films[i]
        h_val = h[e]
        events.append( (a, 0, (b, d, h_val)) )
        events.append( (c, 2, (b, d, h_val)) )
    
    Q = int(data[ptr])
    ptr +=1
    queries = []
    for q_idx in range(Q):
        p = int(data[ptr])
        q = int(data[ptr+1])
        ptr +=2
        x = p + 0.5
        y = q + 0.5
        events.append( (x, 1, (q_idx, y)) )
    
    def event_key(event):
        x, typ, _ = event
        return (x, typ)
    events.sort(key=event_key)
    
    ans = [0] * Q
    for event in events:
        x, typ, data = event
        if typ ==0:
            b, d, h_val = data
            st.range_xor(b, d, h_val)
        elif typ ==2:
            b, d, h_val = data
            st.range_xor(b, d, h_val)
        else:
            q_idx, y = data
            res = st.point_query(int(y))
            ans[q_idx] = res
    
    for a in ans:
        print(a)
if __name__ == "__main__":
    main()
            
            
            
        