解説

頂点 ss から頂点 tt までの経路を考えます。このとき ss から頂点番号を +1 することで tt までたどり着く最短経路で通る s,ts,t 以外の頂点を LL とします。

このとき、 sLts \rightarrow L \rightarrow t という walk が考えられます。 この walk に含まれる頂点の重みのビット単位 XORXOR はそれぞれ、s,L,ts,L,t に含まれる頂点を全て XORXOR したものです。以後、この値を f(s,L,t)f(s,L,t) のように表します。

さて、別の walk についても考えてみましょう。 tt から頂点番号を +1 することで ss までたどり着く最短経路で通る s,ts,t 以外の頂点を RR とします。このとき、一度 tt に着いてから一周する、 sLtRsLts \rightarrow L \rightarrow t \rightarrow R \rightarrow s \rightarrow L \rightarrow t も walk です。 この walk に含まれる頂点の重みのビット単位 XORXORf(s,L,t,R,s,L,t)f(s,L,t,R,s,L,t) です。 ここで、 aXORa=0a XOR a = 0 より、この値は f(R)f(R) に等しくなります。

さらに tt から一周したとき、walk に R,s,L,tR,s,L,t が追加されるので、 walk に含まれる頂点の重みのビット単位 XORXORf(R,R,s,L,t)f(R,R,s,L,t) 、 つまり最短経路の walk に含まれる頂点の重みのビット単位 XORXOR f(s,L,t)f(s,L,t) に一致します。 よって、walk に含まれる頂点の重みのビット単位 XORXORtt から一周するたびに f(s,L,t)f(s,L,t)f(R)f(R) を繰り返します。

よって、求める答えは max(f(s,L,t),f(R))max(f(s,L,t),f(R)) です。

f(s,L,t)=WsWs+1...Wtf(s,L,t) = W_s \oplus W_{s+1} \oplus ... \oplus W_{t}

f(R)=Wt+1Wt+2...Ws1f(R) = W_{t+1} \oplus W_{t+2} \oplus ... \oplus W_{s-1}

なので、累積 XORXOR を前計算することによって 答えを各クエリ当たり O(1)O(1) で計算することができます。

ただし、s>ts > t の場合は ...WN1,WN,W1,...... W_{N-1},W_{N},W_{1},... と続くことに注意してください。