#include #include #include #include #include #include #include #include #include #include #pragma GCC optimize("O3") #pragma comment(linker, "STACK:36777216") using namespace std; using i64 = int64_t; constexpr i64 MOD = 1e9 + 7; using vi = vector; using vvi = vector; using vvvi = vector; uint32_t x = 0, y = 1, z = 2, w = 3; uint32_t generate() { uint32_t t = (x^(x<<11)); x = y; y = z; z = w; w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)); return w; } int main() { uint32_t seed; cin >> seed; x = seed; vector tmp, reserved; int tmpsize = 1000001; for (int i = 0; i < tmpsize; i++) { tmp.push_back(generate()); } sort(tmp.begin(), tmp.end()); for (int i = 250000; i <= 750000; i++) { reserved.push_back(tmp[i]); } double off = 0; int small_cnt = 0; uint32_t min = reserved.front(), max = reserved.back(), mid = reserved[250000]; for (int i = 0; i < 9; i++) { assert(reserved.size() == 500001); for (int j = 0; j < 1000000; j++) { uint32_t u1 = generate(); if (u1 <= mid) { off -= 0.5; if (u1 > min) { small_cnt++; reserved.push_back(u1); } } if (u1 > mid) { off += 0.5; if (u1 < max) { reserved.push_back(u1); } } } sort(reserved.begin(), reserved.end()); assert(mid == reserved[250000 + small_cnt]); int new_mid_ind = 250000 + small_cnt + int(off); // cout << new_mid_ind << " " << reserved.size() << endl; tmp.clear(); for (int k = new_mid_ind - 250000; k <= new_mid_ind + 250000; k++) { assert(k >= 0 && k < reserved.size()); tmp.push_back(reserved[k]); } reserved = vector(tmp); mid = reserved[250000]; min = reserved.front(); max = reserved.back(); off = 0; small_cnt = 0; } cout << mid << endl; }