[HNOI2016] 序列 加强版
题目背景
本题是 [P3246](https://www.luogu.com.cn/problem/P3246) 的数据加强版,扩大了询问次数的范围,增加了强制在线,并加入了一组构造数据。
本题的输入输出格式与原题略有不同。
题目描述
给定长度为 $ n $ 的序列:$ a_1, a_2, \cdots , a_n $,记为 $ a[1 \colon n] $。类似地,$ a[l \colon r] $($ 1 \leq l \leq r \leq N$)是指序列:$ a_{l}, a_{l+1}, \cdots ,a_{r-1}, a_r $。若 $1\leq l \leq s \leq t \leq r \leq n$,则称 $ a[s \colon t] $是 $ a[l \colon r] $ 的子序列。
现在有 $ q $ 个询问,每个询问给定两个数 $ l $ 和 $ r $,$ 1 \leq l \leq r \leq n $,求 $ a[l \colon r] $ 的不同子序列的最小值之和。例如,给定序列
$ 5, 2, 4, 1, 3 $,询问给定的两个数为 $ 1 $ 和 $ 3 $,那么 $ a[1 \colon 3] $ 有 $ 6 $ 个子序列 $a[1 \colon 1], a[2 \colon 2], a[3 \colon 3], a[1 \colon 2],a[2 \colon 3], a[1 \colon 3] $,这 $6 $ 个子序列的最小值之和为 $5+2+4+2+2+2=17$。
输入输出格式
输入格式
第一行三个整数 $n$,$q$,$type$ 表示序列长度,询问数与输入方式。
第二行 $n$ 个整数表示这个序列。
若 $type=0$,接下来 $q$ 行,每行两个数 $l$,$r$,代表询问区间 $[l,r]$。
若 $type=1$,则数据按照如下代码生成:
```cpp
namespace gen{
typedef unsigned long long ull;
ull s,a,b,c,lastans=0;
ull rand(){
return s^=(a+b*lastans)%c;
}
};
```
其中,`s`,`a`,`b`,`c` 的初始值在第三行给出,满足 `s`,`a`,`b` 均在 $[0,10^9]$ 之间,`c` 在 $[1,10^9]$ 之间。`lastans` 表示上次询问的答案转化为 `unsigned long long` 类型后的值,第一次询问时值为 $0$。
每次询问时,你可以通过下面的方式生成 $l$ 和 $r$:
```cpp
l=gen::rand()%n+1;
r=gen::rand()%n+1;
if(l>r) std::swap(l,r);
```
输出格式
一行一个整数,表示每次询问的答案转成 `unsigned long long` 类型后的异或和。
输入输出样例
输入样例 #1
5 5 0
5 2 4 1 3
1 5
1 3
2 4
3 5
2 5
输出样例 #1
28
输入样例 #2
6 5 1
1 1 4 5 1 4
19 19 8 10
输出样例 #2
6
说明
- 对于 $30\%$ 的数据,$1\le q\le10^5$,$type=0$。
- 对于另外 $70\%$ 的数据,$1\le q\le10^7$,$type=1$。
对于 $100\%$ 的数据,$1\le n\le10^5$,$-10^9\le a_i\le10^9$。