1906. map2

你觉得 map / unordered_map 太慢了,因为它们可能会让你 TLE!

给定一个 std::map h,你需要维护 n 次操作:

  1. 对给定 x,若存在 h[x],输出 h[x],否则输出 -1
  2. 对给定 x,y,无论原本是否存在 h[x],用 y 覆盖 h[x]

由于输入很大,给定随机数种子 seed 和上限 p,请使用如下伪随机数生成算法获得每个输入:

#include <bits/stdc++.h> using namespace std; long long seed, p, n, a; long long nextRand() { static long long x = seed; x ^= x << 14; x ^= x >> 45; x ^= x << 11; return (x % p + p) % p; } signed main() { cin >> n >> seed >> p; for (int i = 1; i <= n; ++i) { long long op = nextRand() % 2; if (op == 0) // 操作 1 { long long x = nextRand(); //你的解题代码 } else { long long x = nextRand(); long long y = nextRand(); //你的解题代码 } } return 0; }

由于输出也很大,设每次操作 1 得到的输出依次是 ans_1,\cdots, ans_k,请你输出一个整数 ans_1\oplus ans_2\oplus\cdots\oplus ans_k,即每个答案的异或。

输入

输出一行三个整数 n,seed,p(1\le n,p\le 10^7,1\le seed\le 10^9)

输出

输出一行一个整数,代表你的答案。

样例

标准输入 复制文本
8 114514 3
标准输出 复制文本
-3

提示

对样例,得到的输入是:

2 2 1 2 1 2 1 1 0 1 2 0 2 2

前两次操作二后,有 h[1]=h[2]=2,故第一次询问输出 2;后三次操作二之后有 h[1]=2,h[2]=1,故第二次询问输出 -1。因为 (-1)\oplus 2=-3,故输出 -3

请注意本题的空间限制为 64MB

登录以提交代码。
单点时限 1 秒
内存限制 64 MB
提交 6
通过 4