时间限制:C/C++/Rust/Pascal 5秒,其他语言10秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld
题目描述
本题为问题的困难版本,两题的区别在于,本题您需要进行多轮回答,且额外增加了一个修改操作。对于简单版本的题面部分,我们将使用特殊的格式加以标注。
〖引用开始〗

对于给定的由

个整数构成的
排列 
,我们定义
)
为连续子数组

中最小没有出现过的正整数(其中,

)。

记
%20%3D%20(j%20-%20i%20%2B%201)%20%5Ctimes%20%5Coperatorname%7Bmex%7D(i%2Cj))
,求解:
%3D%5Csum%5Climits_%7Bi%3D1%7D%5E%7Bn%7D%5Csum%5Climits_%7Bj%3Di%7D%5E%7Bn%7D%202%5E%7Bt(i%2Cj)%7D%20%5Ctimes%20t(i%2Cj))

由于答案可能很大,请将答案对

取模后输出。
【名词解释】

长度为

的排列是由

这

个整数、按任意顺序组成的数组,其中每个整数恰好出现一次。例如,

是一个长度为

的排列,而

和

都不是排列,因为前者存在重复元素,后者包含了超出范围的数。
〖引用结束〗

现在,你将会面对

次独立询问。第

次询问给定数组中的两个
元素 
和

,随后:

交换

与

的位置,得到新的排列

;

对于

,计算并输出
)
的值。由于答案可能很大,请将答案对

取模后输出。

注意,各次询问
相互独立,即每次询问都基于最初给出的原排列。
输入描述:
第一行输入一个整数
,表示排列的长度。
第二行输入
个互不相同的整数
,表示给定的排列。
第三行输入一个整数
,表示询问次数。

此后

行,第

行输入两个整数
)
,表示第

次询问。保证

和

均在原数组中出现过。

此外,对于所有询问,保证

。
输出描述:
对于每一次询问,新起一行输出一个整数,表示
对
取模后的结果。
示例1
输入
复制
5
1 2 3 4 5
4
1 2
2 3
3 5
2 4
输出
复制
289459032
289456312
268489720
289407544