区间mex(Hard version)
时间限制:C/C++/Rust/Pascal 5秒,其他语言10秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

\hspace{15pt}本题为问题的困难版本,两题的区别在于,本题您需要进行多轮回答,且额外增加了一个修改操作。对于简单版本的题面部分,我们将使用特殊的格式加以标注。
〖引用开始〗
\hspace{15pt}对于给定的由 n 个整数构成的排列 \{a_1, a_2, \dots, a_n\},我们定义 \operatorname{mex}(i,j) 为连续子数组 \{a_i, a_{i+1}, \dots, a_j\} 中最小没有出现过的正整数(其中,1 \leqq i \leqq j \leqq n)。
\hspace{15pt}t(i,j) = (j - i + 1) \times \operatorname{mex}(i,j),求解:
\displaystyle F(a_1,\dots,a_n)=\sum\limits_{i=1}^{n}\sum\limits_{j=i}^{n} 2^{t(i,j)} \times t(i,j)
\hspace{15pt}由于答案可能很大,请将答案对 998\,244\,353 取模后输出。

【名词解释】
\hspace{15pt}长度为 n 的排列是由 1 \sim nn 个整数、按任意顺序组成的数组,其中每个整数恰好出现一次。例如,\{2,3,1,5,4\} 是一个长度为 5 的排列,而 \{1,2,2\}\{1,3,4\} 都不是排列,因为前者存在重复元素,后者包含了超出范围的数。
〖引用结束〗
\hspace{15pt}现在,你将会面对 q 次独立询问。第 k 次询问给定数组中的两个元素 a_ia_j,随后:
\hspace{23pt}\bullet\,交换 a_ia_j 的位置,得到新的排列 a'
\hspace{23pt}\bullet\,对于 a',计算并输出 F(a') 的值。由于答案可能很大,请将答案对 998\,244\,353 取模后输出。
\hspace{15pt}注意,各次询问相互独立,即每次询问都基于最初给出的原排列。

输入描述:

\hspace{15pt}第一行输入一个整数 n\left(1\leq n\leq 2 \times 10^5\right),表示排列的长度。 
\hspace{15pt}第二行输入 n互不相同的整数 a_1,a_2,\dots,a_n\left(1\leq a_i\leq n\right),表示给定的排列。
\hspace{15pt}第三行输入一个整数 q\left(1\leq q\leq 2 \times 10^5\right),表示询问次数。
\hspace{15pt}此后 q 行,第 i 行输入两个整数 a_i,a_j \left(1\leq a_i,a_j\leq n\right),表示第 i 次询问。保证 a_ia_j 均在原数组中出现过。
\hspace{15pt}此外,对于所有询问,保证 \sum |a_i - a_j| \leqq 10^8

输出描述:

\hspace{15pt}对于每一次询问,新起一行输出一个整数,表示 F(a')998\,244\,353 取模后的结果。
示例1

输入

复制
5
1 2 3 4 5
4
1 2
2 3
3 5
2 4

输出

复制
289459032
289456312
268489720
289407544