配点 : 700 点
問題文
長さ 2N の整数列 A=(A0,A1,…,A2N−1) が与えられます。
また、Q 個のクエリが与えられます。
i=1,2,…,Q について、i 番目のクエリでは 2 つの整数 Xi,Yi が与えられ、下記の操作を行います。
j=0,1,2,…,2N−1 の順に下記の手順を行う。
- まず、j の N 桁の 2 進数表現を bN−1bN−2…b0 とおく。また、bN−1bN−2…b0 から bXi を反転( 0 ならば 1 に、1 ならば 0 に変更)させて得られる 2 進数表現によって表される整数を j′ とおく。
- そして、bXi=Yi ならば、Aj′ に Aj の値を加算する。
すべてのクエリを入力で与えられる順番に実行した後の A の各要素を 998244353 で割ったあまりを出力してください。
$N$ 桁の $2$ 進数表現とは?
非負整数 X (0≤X<2N) の N 桁の 2 進数表現とは、0 と 1 のみからなり下記の条件を満たす唯一の、長さ N の列 bN−1bN−2…b0です。
- ∑i=0N−1bi⋅2i=X
制約
- 1≤N≤18
- 1≤Q≤2×105
- 0≤Ai<998244353
- 0≤Xi≤N−1
- Yi∈{0,1}
- 入力はすべて整数
入力
入力は以下の形式で標準入力から与えられる。
N Q
A0 A1 … A2N−1
X1 Y1
X2 Y2
⋮
XQ YQ
出力
i=0,1,…,2N−1 について、すべてのクエリを実行した後の Ai を 998244353 で割ったあまり Ai′ を、下記の形式にしたがって空白区切りで出力せよ。
A0′ A1′ … A2N−1′
2 2
0 1 2 3
1 1
0 0
2 6 2 5
1 番目のクエリに対する操作は次の通りです。
- j=0 のとき、b1b0=00,j′=2 です。b1=1 であるので、加算の手順は行いません。
- j=1 のとき、b1b0=01,j′=3 です。b1=1 であるので、加算の手順は行いません。
- j=2 のとき、b1b0=10,j′=0 です。b1=1 であるので、A0 に A2 の値を加算します。その結果、A=(2,1,2,3) となります。
- j=3 のとき、b1b0=11,j′=1 です。b1=1 であるので、A1 に A3 の値を加算します。その結果、A=(2,4,2,3) となります。
2 番目のクエリに対する操作は次の通りです。
- j=0 のとき、b1b0=00,j′=1 です。b0=0 であるので、A1 に A0 の値を加算します。その結果、A=(2,6,2,3) となります。
- j=1 のとき、b1b0=01,j′=0 です。b0=0 であるので、加算の手順は行いません。
- j=2 のとき、b1b0=10,j′=3 です。b0=0 であるので、A3 に A2 の値を加算します。その結果、A=(2,6,2,5) となります。
- j=3 のとき、b1b0=11,j′=2 です。b0=0 であるので、加算の手順は行いません。
以上より、すべてのクエリを実行した後の A は (2,6,2,5) です。
3 10
606248357 338306877 919152167 981537317 808873985 845549408 680941783 921035119
1 1
0 0
0 0
0 0
0 1
0 1
0 1
2 0
2 0
2 0
246895115 904824001 157201385 744260759 973709546 964549010 61683812 205420980