ABC261E - Many Operations

考え方

2進数で30桁に制限されている.bitの桁ごとに演算すれば良い.

また,

  • 1〜iまでの操作の合成 (※1)
  • 1〜iまでの操作の合成を値に作用させた結果
を保持できれば良い.

※1:bitの桁ごとに計算して,桁の計算後が終われば捨てることにすれば,1次元配列で済む.

回答例

解説(Editorial - AtCoder Beginner Contest 261)をPythonに焼き直し.
bitの桁ごとに考えるためには,bitのループの中でクエリのループを回せばよい.

N, C = map(int, input().split())
TA = [list(map(int, input().split())) for _ in range(N)]

ans = [0] * N
for i in range(30):
    cur = C >> i & 1
    f = [0, 1]
    for j, (T, A) in enumerate(TA):
        a = A >> i & 1
        if T == 1:
            f = [f[0] & a, f[1] & a]
        elif T == 2:
            f = [f[0] | a, f[1] | a]
        else:
            f = [f[0] ^ a, f[1] ^ a]
        cur = f[cur]
        ans[j] |= cur << i

print(*ans, sep = '\n')