1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
| #include <bits/stdc++.h> using namespace std;
typedef unsigned long long ull;
struct Node { ull l, r; mutable ull v; Node(ull _l = 0, ull _r = 0, ull _v = 0): l(_l), r(_r), v(_v) {} };
bool operator<(Node lhs, Node rhs) { return lhs.l < rhs.l; }
ull pow(ull a, ull p, ull b) { ull res(1); a %= b; while (p) { if (p & 1) res = res * a % b; a = a * a % b; p >>= 1; } return res % b; }
struct ChtholyTree { set<Node> nodes; ChtholyTree() {} void addnode(ull l, ull r, ull v) { nodes.insert(Node(l, r, v)); } set<Node>::iterator split(ull pos) { set<Node>::iterator i(nodes.lower_bound(Node(pos))); if (i != nodes.end() && i->l == pos) return i; --i; if (i->r <= pos) return nodes.end(); ull l(i->l), r(i->r), v(i->v); nodes.erase(i); nodes.insert(Node(l, pos, v)); return nodes.insert(Node(pos, r, v)).first; } void add(ull l, ull r, ull v) { set<Node>::iterator rp(split(r)), lp(split(l)); while (lp != rp) lp->v += v, ++lp; } void assign(ull l, ull r, ull v) { set<Node>::iterator rp(split(r)), lp(split(l)); nodes.erase(lp, rp); nodes.insert(Node(l, r, v)); } ull kth(ull l, ull r, ull k) { vector<pair<ull, ull> > rnks; set<Node>::iterator rp(split(r)), lp(split(l)); while (lp != rp) rnks.push_back(make_pair(lp->v, lp->r - lp->l)), ++lp; sort(rnks.begin(), rnks.end()); for (vector<pair<ull, ull> >::const_iterator i(rnks.begin()); i != rnks.end(); ++i) { if (i->second >= k) return i->first; k -= i->second; } return -1; } ull pow(ull l, ull r, ull x, ull y) { set<Node>::iterator rp(split(r)), lp(split(l)); ull res(0); while (lp != rp) res = (res + (lp->r - lp->l) * ::pow(lp->v, x, y) % y) % y, ++lp; return res; } };
struct RandMachine { ull seed; RandMachine(ull s): seed(s) {} ull operator()() { ull ret(seed); seed = (seed * 7 + 13) % 1000000007; return ret; } };
ull read() { ull x(0); char c(getchar()); while (c < '0' || c > '9') c = getchar(); while (c >= '0' && c <= '9') x = (x << 3) + (x << 1) + (c ^ 48), c = getchar(); return x; }
int main() { const ull N(read()), M(read()), SEED(read()), VMAX(read()); RandMachine rnd(SEED); ChtholyTree tree; for (ull i(0); i != N; ++i) { tree.addnode(i, i + 1, rnd() % VMAX + 1); } for (ull op, l, r, x, y, i(0); i != M; ++i) { op = rnd() % 4 + 1; l = rnd() % N + 1; r = rnd() % N + 1; if (l > r) swap(l, r); if (op == 3) x = rnd() % (r - l + 1) + 1; else x = rnd() % VMAX + 1; if (op == 4) y = rnd() % VMAX + 1; --l; switch (op) { case 1: tree.add(l, r, x); break; case 2: tree.assign(l, r, x); break; case 3: printf("%llu\n", tree.kth(l, r, x)); break; case 4: printf("%llu\n", tree.pow(l, r, x, y)); break; } } return 0; }
|