#P6604. [HNOI2016] 序列 加强版
[HNOI2016] 序列 加强版
题目背景
本题是 P3246 的数据加强版,扩大了询问次数的范围,增加了强制在线,并加入了一组构造数据。
本题的输入输出格式与原题略有不同。
题目描述
给定长度为 的序列:,记为 。类似地,()是指序列:。若 ,则称 是 的子序列。
现在有 个询问,每个询问给定两个数 和 ,,求 的不同子序列的最小值之和。例如,给定序列 ,询问给定的两个数为 和 ,那么 有 个子序列 $a[1 \colon 1], a[2 \colon 2], a[3 \colon 3], a[1 \colon 2],a[2 \colon 3], a[1 \colon 3] $,这 个子序列的最小值之和为 。
输入格式
第一行三个整数 ,, 表示序列长度,询问数与输入方式。
第二行 个整数表示这个序列。
若 ,接下来 行,每行两个数 ,,代表询问区间 。
若 ,则数据按照如下代码生成:
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
均在 之间,c
在 之间。lastans
表示上次询问的答案转化为 unsigned long long
类型后的值,第一次询问时值为 。
每次询问时,你可以通过下面的方式生成 和 :
l=gen::rand()%n+1;
r=gen::rand()%n+1;
if(l>r) std::swap(l,r);
输出格式
一行一个整数,表示每次询问的答案转成 unsigned long long
类型后的异或和。
5 5 0
5 2 4 1 3
1 5
1 3
2 4
3 5
2 5
28
6 5 1
1 1 4 5 1 4
19 19 8 10
6
提示
- 对于 的数据,,。
- 对于另外 的数据,,。
对于 的数据,,。