#ifdef Asaad
#include "cp.h"
#define debug(...) _dbg_many(#__VA_ARGS__, __VA_ARGS__)
#define here cerr << "LINE " << __LINE__ << "\n"
#else
#include <bits/stdc++.h>
using namespace std;
/*
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template<class T>
using oset = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
*/
#define debug(...)
#define here
#endif
#define ll long long
#define int long long
#define all(x) x.begin(), x.end()
#define siz(x) ((int)x.size())
#define yes cout << "YES\n"
#define no cout << "NO\n"
#define f first
#define s second
#define eb emplace_back
#define pb push_back
const int mod = 1e9+7;
const int N = 200009;
const long long inf = 1e18+12309138;
double eps = 1e-9;
mt19937 rng((unsigned)chrono::high_resolution_clock::now().time_since_epoch().count());
int rnd(int l, int r) {
return uniform_int_distribution<int>(l, r)(rng);
}
pair<int, int> slow ( int x, int y, int w ) {
set<int> nx, ny;
int box = 0, c = 0;
while ( x+y > 0 ) {
if ( x >= y ) {
x--;
nx.insert(box);
} else {
y--;
ny.insert(box);
}
c++;
if ( c == w ) {
c = 0;
box++;
}
}
return { siz(nx), siz(ny) };
}
pair<int, int> As3ad ( int x, int y, int w ) {
int ans[2] = {0};
if ( w == 1 ) {
return {x, y};
}
bool p = 0;
bool big = ( x < y );
int dif = abs(x-y);
ans[big] += (dif+w-1)/w;
int tot = min(x, y)*2;
int rem = (w-(dif%w))%w;
if ( rem > 0 ) {
if ( big && (tot>0) ) ans[0]++;
else if ( rem > 1 && (tot>1) ) ans[1]++;
p^=rem%2;
if ( tot <= rem ) {
return { ans[0], ans[1] };
}
tot-= rem;
}
ans[0] += tot/w;
ans[1] += tot/w;
p^=((tot/w)*w)%2;
tot-= (tot/w)*w;
if ( tot > 0 ) ans[p]++;
if ( tot > 1 ) ans[p^1]++;
return { ans[0], ans[1] };
}
void ch ( int x, int y, int w ) {
pair<int, int> correct = slow(x, y, w);
pair<int, int> asaad = As3ad( x, y, w );
if ( asaad != correct ) {
cout << "BAD ... \n";
cout << "x: " << x << "\n";
cout << "y: " << y << "\n";
cout << "w: " << w << "\n";
cout << "Correct: " << correct.f << " " << correct.s << "\n";
cout << "yours ): " << asaad.f << " " << asaad.s << "\n";
exit(0);
}
}
void tc () {
//nb=
for (int x=0; x<100; x++) {
for (int y=0; y<100; y++) {
for (int w = 1; w<100; w++) {
ch(x, y, w);
}
}
}
for (int i=0; i<1000; i++) {
int x = rnd( 0, 1e5 );
int y = rnd( 0, 1e5 );
int w = rnd( 1, 1e5 );
ch(x, y, w);
}
}
signed main () {
ios::sync_with_stdio(false);
cin.tie(0);
//freopen( "input.txt", "r", stdin );
//freopen( "output.txt", "w", stdout );
//cout << fixed << setprecision(9);
//pre();
int t=1;
//cin >> t;
for (int i=1; i<=t; i++) {
#ifdef Asaad
auto start = chrono::high_resolution_clock::now();
//cout << "---Case " << i << " Start---\n\n";
#endif
tc();
#ifdef Asaad
auto end = chrono::high_resolution_clock::now();
//cout << "---Case " << i << " End---\n";
//if ( i%100000 == 0 )
cerr << "Time #" << i << ": " << chrono::duration_cast<chrono::milliseconds>(end - start).count() << "ms" << endl;
//cout << "--------------\n";
#endif
}
cout << "ALL good\n";
}
CgojaWZkZWYgQXNhYWQKICAgICNpbmNsdWRlICJjcC5oIgogICAgI2RlZmluZSBkZWJ1ZyguLi4pIF9kYmdfbWFueSgjX19WQV9BUkdTX18sIF9fVkFfQVJHU19fKQogICAgI2RlZmluZSBoZXJlIGNlcnIgPDwgIkxJTkUgIiA8PCBfX0xJTkVfXyA8PCAiXG4iCiNlbHNlIAogICAgI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgLyoKICAgICNpbmNsdWRlIDxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4KICAgICNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPgogICAgdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CiAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgdXNpbmcgb3NldCA9IHRyZWU8VCwgbnVsbF90eXBlLCBsZXNzPFQ+LCByYl90cmVlX3RhZywgdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPjsKICAgICovCiAgICAjZGVmaW5lIGRlYnVnKC4uLikgCiAgICAjZGVmaW5lIGhlcmUgCiNlbmRpZgoKCgojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGludCBsb25nIGxvbmcKI2RlZmluZSBhbGwoeCkgeC5iZWdpbigpLCB4LmVuZCgpCiNkZWZpbmUgc2l6KHgpICgoaW50KXguc2l6ZSgpKQojZGVmaW5lIHllcyBjb3V0IDw8ICJZRVNcbiIKI2RlZmluZSBubyBjb3V0IDw8ICJOT1xuIgojZGVmaW5lIGYgZmlyc3QKI2RlZmluZSBzIHNlY29uZAojZGVmaW5lIGViIGVtcGxhY2VfYmFjawojZGVmaW5lIHBiIHB1c2hfYmFjawoKCmNvbnN0IGludCBtb2QgPSAxZTkrNzsKY29uc3QgaW50IE4gPSAyMDAwMDk7CmNvbnN0IGxvbmcgbG9uZyBpbmYgPSAxZTE4KzEyMzA5MTM4Owpkb3VibGUgZXBzID0gMWUtOTsKCm10MTk5Mzcgcm5nKCh1bnNpZ25lZCljaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkpOwoKaW50IHJuZChpbnQgbCwgaW50IHIpIHsKICAgIHJldHVybiB1bmlmb3JtX2ludF9kaXN0cmlidXRpb248aW50PihsLCByKShybmcpOwp9CgoKcGFpcjxpbnQsIGludD4gc2xvdyAoIGludCB4LCBpbnQgeSwgaW50IHcgKSB7CiAgICBzZXQ8aW50PiBueCwgbnk7CiAgICBpbnQgYm94ID0gMCwgYyA9IDA7CiAgICB3aGlsZSAoIHgreSA+IDAgKSB7CiAgICAgICAgaWYgKCB4ID49IHkgKSB7CiAgICAgICAgICAgIHgtLTsKICAgICAgICAgICAgbnguaW5zZXJ0KGJveCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgeS0tOwogICAgICAgICAgICBueS5pbnNlcnQoYm94KTsKICAgICAgICB9CiAgICAgICAgYysrOwogICAgICAgIGlmICggYyA9PSB3ICkgewogICAgICAgICAgICBjID0gMDsKICAgICAgICAgICAgYm94Kys7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIHsgc2l6KG54KSwgc2l6KG55KSB9OwoKfSAKCnBhaXI8aW50LCBpbnQ+IEFzM2FkICggaW50IHgsIGludCB5LCBpbnQgdyApIHsKCiAgICBpbnQgYW5zWzJdID0gezB9OwogICAgaWYgKCB3ID09IDEgKSB7CiAgICAgICAgcmV0dXJuIHt4LCB5fTsKICAgIH0KICAgIGJvb2wgcCA9IDA7CiAgICBib29sIGJpZyA9ICggeCA8IHkgKTsKICAgIGludCBkaWYgPSBhYnMoeC15KTsKICAgIGFuc1tiaWddICs9IChkaWYrdy0xKS93OwogICAgaW50IHRvdCA9IG1pbih4LCB5KSoyOwogICAgaW50IHJlbSA9ICh3LShkaWYldykpJXc7CiAgICBpZiAoIHJlbSA+IDAgKSB7CiAgICAgICAgaWYgKCBiaWcgJiYgKHRvdD4wKSApIGFuc1swXSsrOwogICAgICAgIGVsc2UgaWYgKCByZW0gPiAxICAmJiAodG90PjEpICkgYW5zWzFdKys7CiAgICAgICAgcF49cmVtJTI7IAogICAgICAgIGlmICggdG90IDw9IHJlbSApIHsKICAgICAgICAgICAgcmV0dXJuIHsgYW5zWzBdLCBhbnNbMV0gfTsKICAgICAgICB9CiAgICAgICAgdG90LT0gcmVtOwogICAgfQogICAgYW5zWzBdICs9IHRvdC93OwogICAgYW5zWzFdICs9IHRvdC93OwogICAgcF49KCh0b3QvdykqdyklMjsKICAgIHRvdC09ICh0b3QvdykqdzsKICAgIGlmICggdG90ID4gMCApIGFuc1twXSsrOwogICAgaWYgKCB0b3QgPiAxICkgYW5zW3BeMV0rKzsKIAogICAgcmV0dXJuIHsgYW5zWzBdLCBhbnNbMV0gfTsKfQoKdm9pZCBjaCAoIGludCB4LCBpbnQgeSwgaW50IHcgKSB7CiAgICBwYWlyPGludCwgaW50PiBjb3JyZWN0ID0gc2xvdyh4LCB5LCB3KTsKICAgIHBhaXI8aW50LCBpbnQ+IGFzYWFkID0gQXMzYWQoIHgsIHksIHcgKTsKICAgIGlmICggYXNhYWQgIT0gY29ycmVjdCApIHsKICAgICAgICBjb3V0IDw8ICJCQUQgLi4uIFxuIjsKICAgICAgICBjb3V0IDw8ICJ4OiAiIDw8IHggPDwgIlxuIjsgCiAgICAgICAgY291dCA8PCAieTogIiA8PCB5IDw8ICJcbiI7IAogICAgICAgIGNvdXQgPDwgInc6ICIgPDwgdyA8PCAiXG4iOyAKICAgICAgICBjb3V0IDw8ICJDb3JyZWN0OiAiIDw8IGNvcnJlY3QuZiA8PCAiICIgPDwgY29ycmVjdC5zIDw8ICJcbiI7CiAgICAgICAgY291dCA8PCAieW91cnMgKTogIiA8PCBhc2FhZC5mIDw8ICIgIiA8PCBhc2FhZC5zIDw8ICJcbiI7CiAgICAgICAgZXhpdCgwKTsKICAgIH0KfQoKCnZvaWQgdGMgKCkgewogICAgLy9uYj0KCiAgICBmb3IgKGludCB4PTA7IHg8MTAwOyB4KyspIHsKICAgICAgICBmb3IgKGludCB5PTA7IHk8MTAwOyB5KyspIHsKICAgICAgICAgICAgZm9yIChpbnQgdyA9IDE7IHc8MTAwOyB3KyspIHsKICAgICAgICAgICAgICAgIGNoKHgsIHksIHcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgZm9yIChpbnQgaT0wOyBpPDEwMDA7IGkrKykgewogICAgICAgIGludCB4ID0gcm5kKCAwLCAxZTUgKTsKICAgICAgICBpbnQgeSA9IHJuZCggMCwgMWU1ICk7CiAgICAgICAgaW50IHcgPSBybmQoIDEsIDFlNSApOwogICAgICAgIGNoKHgsIHksIHcpOwoKICAgIH0KCgogICAgCgogICAgCiAgICAKCn0gCgoKCgoKc2lnbmVkIG1haW4gKCkgeyAKICAgIGlvczo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUoMCk7CiAgICAvL2ZyZW9wZW4oICJpbnB1dC50eHQiLCAiciIsIHN0ZGluICk7CiAgICAvL2ZyZW9wZW4oICJvdXRwdXQudHh0IiwgInciLCBzdGRvdXQgKTsKICAgIC8vY291dCA8PCBmaXhlZCA8PCBzZXRwcmVjaXNpb24oOSk7CiAgICAvL3ByZSgpOwogICAgaW50IHQ9MTsKICAgIC8vY2luID4+IHQ7CiAgICAKICAgIGZvciAoaW50IGk9MTsgaTw9dDsgaSsrKSB7CiAgICAgICAgI2lmZGVmIEFzYWFkCiAgICAgICAgICAgIGF1dG8gc3RhcnQgPSBjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CiAgICAgICAgICAgIC8vY291dCA8PCAiLS0tQ2FzZSAiIDw8IGkgPDwgIiBTdGFydC0tLVxuXG4iOwogICAgICAgICNlbmRpZgoKICAgICAgICB0YygpOwoKCiAgICAgICAgI2lmZGVmIEFzYWFkCiAgICAgICAgICAgIGF1dG8gZW5kID0gY2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwogICAgICAgICAgICAvL2NvdXQgPDwgIi0tLUNhc2UgIiA8PCBpIDw8ICIgRW5kLS0tXG4iOwogICAgICAgICAgICAvL2lmICggaSUxMDAwMDAgPT0gMCApCiAgICAgICAgICAgIGNlcnIgPDwgIlRpbWUgIyIgPDwgaSA8PCAiOiAiIDw8IGNocm9ubzo6ZHVyYXRpb25fY2FzdDxjaHJvbm86Om1pbGxpc2Vjb25kcz4oZW5kIC0gc3RhcnQpLmNvdW50KCkgPDwgIm1zIiA8PCBlbmRsOwogICAgICAgICAgICAvL2NvdXQgPDwgIi0tLS0tLS0tLS0tLS0tXG4iOwogICAgICAgICNlbmRpZgogICAgfQogICAgY291dCA8PCAiQUxMIGdvb2RcbiI7Cn0KCgoK