#P1046. 神秘序列的区间查询

神秘序列的区间查询

题目描述

你获得了一个长度为 nn 的整数序列 aa,这个序列是通过一个特定的伪随机数生成器构造的,你需要按照给定的种子 ss 初始化生成器,然后依次调用 read()read() 函数得到每个元素的值。之后,有 mm 次询问,每次询问给出一个区间 [l,r][l,r](注意:ll 和 rr 也是由随机数生成的,并且可能 l>rl>r),请你求出该区间内的最大值。 伪随机数生成器如下:

namespace GenHelper
{
    unsigned z1,z2,z3,z4,b;
    unsigned rand_()
    {
    b=((z1<<6)^z1)>>13;
    z1=((z1&4294967294U)<<18)^b;
    b=((z2<<2)^z2)>>27;
    z2=((z2&4294967288U)<<2)^b;
    b=((z3<<13)^z3)>>21;
    z3=((z3&4294967280U)<<7)^b;
    b=((z4<<3)^z4)>>12;
    z4=((z4&4294967168U)<<13)^b;
    return (z1^z2^z3^z4);
    }
}
void srand(unsigned x)
{
  using namespace GenHelper;
  z1=x; 
  z2=(~x)^0x233333333U;
  z3=x^0x1234598766U; 
  z4=(~x)+51;
}
int read()
{
    using namespace GenHelper;
    int a=rand_()&32767;
    int b=rand_()&32767;
    return a*32768+b;
}

输入格式

第一行包含三个整数 nn,mm,ss,分别表示序列长度、询问次数以及随机种子。 接下来,你需要使用提供的 srand(s)srand(s)初始化随机生成器,然后连续调用 read()read() 共 nn 次,得到序列的每个元素 aia_i。 接着,对于每一次询问: 调用一次 read()read()得到一个整数 LL,令 ll=LL modmod nn ++ 11; 再调用一次 read()read()得到一个整数 RR,令 rr=RR modmod nn ++ 11;

输出格式

输出一个整数,表示每次询问的答案的和。

样例

233 233 233
243704637294

数据范围

测试点编号 n,m=n,m=
1,2 10001000
3 10510^5
4 5∗1055*10^5
5 10610^6
6 10710^7
7 1.2∗1071.2*10^7
8 1.5∗1071.5*10^7
9 2∗1072*10^7