luogu#P9639. 「yyOI R1」youyou 的序列

「yyOI R1」youyou 的序列

题目描述

给定一个长度为 nn 的序列 a1na_{1\dots n},以及 qq 次操作。

定义一次操作为:交换 aka_kak+1a_{k+1} 的值,并立即询问所有以 ai  (i[1,n])a_i \;( i\in [1,n]) 为峰的子序列数量之和,对 42949672964294967296 取模。这里的交换是暂时的,也就是说,它仅在下一次操作前有效。

在此我们认为,一个长度至少为 11 的序列 $[a_1,a_2 ,\cdots,a_{s-1},a_s,a_{s+1},\cdots,a_{n-1},a_n ]$,满足 $a_1<a_2<\cdots<a_{s-1}a_{s+1}>\cdots >a_{n-1}>a_n$,则称此序列为以 asa_s 为峰的序列。

你的任务是回答出所有操作的答案。

输入格式

第一行输入两个整数 n,qn,q

第二行输入 nn 个正整数,表示一开始的序列 a1na_{1\dots n}

第三行,输入一个整数 kk,表示进行第一次操作(定义见上),保证 1k<n1\le k <n


22 到第 qq 次操作的 kk 值由如下方法得到:

int Answer(unsigned int ans)
{
    unsigned int BASE=998244353ll*ans+ans*ans+ans/9991+ans%2159;
    BASE^=9810;
    BASE^=51971;
    BASE=BASE>>7;
    BASE=BASE<<11;
    BASE^=751669;
    BASE^=23465695622566ll;
    return BASE%(n-1)+1;
}

当你每完成一次询问后,将你这次询问的答案 ansans 作为参数,恰好调用一次 Answer(ans)

得到的返回值即为下一次操作的 kk

注意:本输入方式仅用于减少输入量,标准算法不依赖于此输入方式。

输出格式

你需要输出所有操作的答案,每个答案输出一行。

4 3
1 5 7 3
1

12
13
13

5 5
7 7 7 7 6
1
9
9
9
9
9

提示

样例解释 #1

第一次操作的 kk11

此时序列为 [5,1,7,3][5,1,7,3]

峰为 a1a_1[5][5][5,1][5,1][5,3][5,3]

峰为 a2a_2[1][1]

峰为 a3a_3[7][7][5,7][5,7][1,7][1,7][7,3][7,3][5,7,3][5,7,3][1,7,3][1,7,3]

峰为 a4a_4[3][3][1,3][1,3]

共计 1212 个不同的子序列,答案输出 1212

第二次和第三次操作的 kk 均为 33 ,此时有 1313 个不同的序列满足条件。

样例解释 #2

第一次操作的 kk11

此时序列为 [7,7,7,7,6][7,7,7,7,6]

峰为 a1a_1[7][7][7,6][7,6]

峰为 a2a_2[7][7][7,6][7,6]

峰为 a3a_3[7][7][7,6][7,6]

峰为 a4a_4[7][7][7,6][7,6]

峰为 a5a_5[6][6]

共计 99 个不同的子序列,答案输出 99

后四次操作同理。


数据范围

本题采用捆绑测试。

子任务编号 nn qq 分数
11 500\le 500 100\le 100 1010
22 2×103\le2\times10^3 5×103 \le 5\times10^3 2020
33 3×104\le3\times10^4 104\le 10^4 3030
44 106\le10^6 106 \le10^6 4040

对于 100%100\% 的数据,2n1062\le n\le10^61q1061\le q\le10^61ai1041\le a_i\le10^4