青蛙树
时间限制:C/C++/Rust/Pascal 5秒,其他语言10秒
空间限制:C/C++/Rust/Pascal 512 M,其他语言1024 M
64bit IO Format: %lld

题目描述

牛牛是一个爱 Froggy 的男孩子。

活点地图上显示,在 Hogwarts 的黑湖上,有 个石墩,编号为 ,第 个石墩上有 只青蛙。

牛牛想进行 独立的操作,每次只保留编号在 中的石墩。

牛牛想起了麻瓜的 OI,想起了二叉树。他决定将这些石墩用一些边连起来,并指定一个根,使之成为一棵二叉树。

二叉树虽然是麻瓜发明的,但是牛牛觉得二叉树的中序遍历充满魔力,于是他希望对这棵二叉树中序遍历得到的编号序列恰好为

牛牛今天又从全年级第一的麻瓜出身的 Hermione 那学了一种新的数据结构——堆。他希望借这棵二叉树复习一下堆的结构,所以他又规定这棵二叉树需要满足任意一个不为根的石墩的青蛙数量不少于这个石墩的父亲的青蛙数量。

对于每次操作,请你帮助牛牛求出有多少种符合条件的不同的二叉树。

两棵二叉树不同当且仅当满足下列条件之一:

  • 根的编号不同;
  • 存在两个石墩 满足恰好在其中一棵树中存在边

由于答案可能很大,你只需要输出答案对 取模的结果即可。

输入描述:

第一行一个整数 ,表示石墩数量。
第二行 n 个整数 a_i 表示第 i 个石墩上的青蛙数量。
第三行一个整数 ,表示操作次数。
接下来 q 行,第 i 行两个整数 ,表示第 i 次操作保留的石墩区间。

输出描述:

输出 q 行,第 i 行表示第 i 次操作后的答案。注意操作之间互相独立,即之前的操作不会影响这一操作的答案。
示例1

输入

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

输出

复制
2
1
1
2