Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #include <cmath>
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- using namespace __gnu_pbds;
- using namespace std;
- #define rep(i, n) for(ll i = 0; i < (ll)n; i++)
- #define repi(i, a, n) for(ll i = a; i < (ll)n; i++)
- #define repii(i, a, n, b) for(ll i = a; i < (ll)n; i+=b)
- #define pb push_back
- #define vi vector <int>
- #define vll vector <ll>
- #define vpll vector <pair <ll, ll> >
- #define all(v) v.begin(), v.end()
- #define M_PI 3.14159265358979323846
- #define bs binary_search
- #define ff first
- #define ss second
- #define ordered_set tree<int, null_type, less <int>, rb_tree_tag, tree_order_statistics_node_update>
- typedef long long ll;
- const long long max_sz = 1e2 + 1;
- const long long mod = 1e9 + 7;
- const long long MAXN = 4e18 + 1;
- // DEBUGGING TEMPLATE
- void __print(int x) {cerr << x;}
- void __print(long x) {cerr << x;}
- void __print(long long x) {cerr << x;}
- void __print(unsigned x) {cerr << x;}
- void __print(unsigned long x) {cerr << x;}
- void __print(unsigned long long x) {cerr << x;}
- void __print(float x) {cerr << x;}
- void __print(double x) {cerr << x;}
- void __print(long double x) {cerr << x;}
- void __print(char x) {cerr << '\'' << x << '\'';}
- void __print(const char *x) {cerr << '\"' << x << '\"';}
- void __print(const string &x) {cerr << '\"' << x << '\"';}
- void __print(bool x) {cerr << (x ? "true" : "false");}
- template<typename T, typename V>
- void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ','; __print(x.second); cerr << '}';}
- template<typename T>
- void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? "," : ""), __print(i); cerr << "}";}
- void _print() {cerr << "]\n";}
- template <typename T, typename... V>
- void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
- #ifndef ONLINE_JUDGE
- #define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
- #else
- #define debug(x...)
- #endif
- ll gcd(ll a, ll b){
- if(b == 0) return a;
- return gcd(b, a%b);
- }
- void print(vll v){
- rep(i, v.size()) cout << v[i] << " ";
- cout << endl;
- }
- vll div(ll n){
- vll v;
- repi(i, 1, sqrt(n)+1){
- if((n%i) == 0){
- if(i == n/i) v.pb(i);
- else v.pb(i), v.pb(n/i);}
- }
- return v;
- }
- ll powmod(ll a, ll b, ll c){
- if(b == 0) return 1%c;
- else if(b % 2 == 0) return powmod((a*a)%c, b/2, c);
- return (a*powmod((a*a)%c, (b-1)/2, c))%c;
- }
- void printp(vpll v){
- rep(i, v.size()) cout << v[i].first << " " << v[i].second << endl;
- }
- ll min(ll a, ll b){
- return a < b ? a : b;
- }
- ll max(ll a, ll b){
- return a > b ? a : b;
- }
- ll min3(ll a, ll b, ll c){
- return min(min(a, b), c);
- }
- void print_map(map <ll, ll> m){
- for(auto it : m) cout << it.first << " " << it.second << "\n";
- }
- void print_set(set <ll> s){
- for(auto it : s) cout << it << " ";
- cout << endl;
- }
- ll inv(ll a){
- return powmod(a, mod-2, mod);
- }
- bool prime[max_sz];
- // Sieve of erathosthenes
- void sieve(){
- memset(prime, true, sizeof(prime));
- for(ll i = 2; i * i < max_sz; i++){
- if(prime[i] == true){
- for(ll j = i*i ; j < max_sz; j+=i){
- prime[j] = false;
- }
- }
- }
- }
- vll pow(ll a){
- vll res;
- ll temp = 1;
- while(temp <= MAXN){
- res.pb(temp);
- temp *= a;
- }
- return res;
- }
- vll v(max_sz), powers(max_sz), inverse(max_sz);
- void fact(){
- v[0] = 1;
- repi(i, 1, max_sz) v[i] = (v[i-1]*i)%mod;
- rep(i, max_sz) inverse[i] = powmod(v[i], mod - 2, mod);
- }
- // Obtain the binomial coefficients modulo mod
- ll binom(ll n, ll p){
- if(n < p || p < 0) return 0;
- // ll tmp1 = powmod(v[p], mod-2, mod);
- // ll tmp2 = powmod(v[n - p], mod-2, mod);
- ll d = ((inverse[p] * inverse[n - p])%mod * v[n]) % mod;
- return d;
- }
- //Obtain the smallest x such that ax = 1 mod m and (a, m) = 1
- ll modinv(ll a, ll m){
- ll m0 = m, y = 0, x = 1;
- if (m == 1) return 0;
- while (a > 1){
- ll q = a / m, t = m;
- m = a % m, a = t;
- t = y, y = x - q * y, x = t;
- }
- if (x < 0) x += m0;
- return x;
- }
- void swap(ll &a, ll &b){
- {
- ll temp = a;
- a = b;
- b = temp;
- }
- }
- ll spf[max_sz];
- //Compute the smallest prime factor of all numbers
- void smallest_prime(){
- spf[1] = 1;
- for(ll i = 2; i <= max_sz; i++) spf[i] = i;
- for (ll i = 4; i <= max_sz; i += 2) spf[i] = 2;
- for (ll i = 3; i * i <= max_sz; i++){
- if (spf[i] == i){
- for (ll j= i * i; j <= max_sz; j+=i)
- if (spf[j] == j) spf[j] = i;
- }
- }
- }
- //Prime factorise a number in O(log n) time
- vll factorise(ll x){
- vector<ll> res;
- while (x != 1){
- res.push_back(spf[x]);
- x = x / spf[x];
- }
- return res;
- }
- //Obtain the digits in the decimal 10 representation of number n
- vll digits(ll n){
- vll res;
- while(n != 0){
- res.pb(n % 10);
- n /= 10;
- }
- // sort(all(res));
- return res;
- }
- //Check if a is a suffix of b
- ll suffix(string a, string b){
- if(a.size() > b.size()) return 0;
- for(ll i = a.size() - 1; i >= 0; --i){
- if(b[b.size() - 1 - (a.size() - 1 - i)]) return 0;
- }
- return 1;
- }
- ll inc(vll a){
- rep(i, a.size() - 1) if(a[i + 1] < a[i]) return 0;
- return 1;
- }
- ll dec(vll a){
- rep(i, a.size() - 1) if(a[i + 1] > a[i]) return 0;
- return 1;
- }
- vll bin(ll a){
- vll res;
- while(a != 0) res.pb(a % 2), a /= 2;
- while((ll)res.size() != 36) res.pb(0);
- return res;
- }
- ll up(ll a, ll b){
- if(a % b == 0) return a / b;
- return a / b + 1;
- }
- // #define ps __builtin_popcount
- vll dig(ll n){
- vll res;
- if(n == 0) {res.pb(0); return res;}
- while(n != 0) res.pb(n % 10), n /= 10;
- return res;
- }
- // Sort a pair in decreasing order by first element
- bool inrev(const pair <ll, ll> &a, const pair <ll, ll> &b){
- return a.ff > b.ff;
- if(a.ff == b.ff) return a.ss < b.ss;
- }
- #define ff first
- #define ss second
- #define IOS ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL)
- const ll nax = 2e5 + 5;
- vll pos[nax];
- // vll two = pow(2);
- vll ten = pow(10);
- pair <ll, ll> naive(vll a, ll k, ll x){
- rep(i, k){
- sort(all(a));
- debug(a);
- rep(j, a.size()) if(j % 2 == 0) a[j] = a[j] ^ x;
- }
- sort(all(a));
- ll mx = a[a.size() - 1], mn = a[0];
- pair <ll, ll> p = {mx, mn};
- return p;
- }
- int main(){
- ll t = 1;
- // cin >> t;
- while(t--){
- ll n, k, x;
- cin >> n >> k >> x;
- vll a(n);
- rep(i, n) cin >> a[i];
- vll b = a;
- map <vector <ll>, ll> m;
- ll pos = -1, cycle = -1;
- sort(all(a));
- m.insert({a, 0});
- repi(i, 1, k + 1){
- debug(a);
- rep(j, n) if(j % 2 == 0){
- a[j] = a[j] ^ x;
- }
- sort(all(a));
- auto it = m.find(a);
- if(it != m.end()) {cycle = i - it -> ss, pos = i; break;}
- m.insert({a, i});
- }
- debug(pos, cycle);
- if(pos == -1 || (k - pos) % cycle == 0){
- sort(all(a));
- ll mx = a[n - 1], mn = a[0];
- debug(mx, mn);
- cout << mx << " " << mn << endl;
- }
- else{
- ll rem = (k - pos) % cycle;
- ll till = pos - cycle + rem;
- for(auto it : m) if(it.ss == till){
- vll res = it.ff;
- sort(all(res));
- ll mx = res[n - 1], mn = res[0];
- cout << mx << " " << mn << endl;
- }
- }
- // pair <ll, ll> res = naive(b, k, x);
- // debug(res.ff, res.ss);
- }
- }
Add Comment
Please, Sign In to add comment