#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);
}
int dp[20][2][2][2];
int lockIN(int n, int x){
//ll n, x;cin>>n>>x;
if(!n){
if ( x ) return 1LL;
return 0LL;
}memset(dp,-1,sizeof(dp));
string sl = to_string(n);
string sr = to_string(x);
while(sl.size()<sr.size())sl='0'+sl;
int sz = sl.size();
auto go =[&](auto&&go,int idx, int ub, int lb, int z){
if(idx>=sz) return 0LL;
int lo = lb?sl[idx]-'0':0;
int hi = ub?sr[idx]-'0':9;
int&ret=dp[idx][ub][lb][z];
if(~ret) return ret;
ret=100;
for(int i = lo;i<=hi;++i){
ret=min(ret,(!z&&i==0)+go(go,idx+1,ub&&(i==hi),lb&&(i==lo),z&&(i==0)));
}
return ret;
};
go(go,0,1,1,1);
ll res = 0;
auto build =[&](auto&&build,int idx,int ub, int lb, int z){
if(idx>=sz) return;
int lo = lb?sl[idx]-'0':0;
int hi = ub?sr[idx]-'0':9;
int ret = dp[idx][ub][lb][z];
for(int i = lo;i<=hi;++i){
if(ret==(!z&&i==0)+go(go,idx+1,ub&&(i==hi),lb&&(i==lo),z&&(i==0))){
res=res*10+i;
build(build,idx+1,ub&&(i==hi),lb&&(i==lo),z&&(i==0));
return;
}
}
return;
};
build(build,0,1,1,1);
return res-n;
}
int bad (int x, int y) {
//nb=
//int x, y;
//cin >> x >> y;
y-= x;
if ( x == 0 ) {
return min(1LL, y);
}
int ans = 0;
vector<int> pw(19, 1), mo(19, 1);
for (int i=1; i<19; i++) {
pw[i] = pw[i-1]*10;
mo[i] = mo[i-1]*10+1;
}
for (int i=0; i<19; i++) {
int bye = x/pw[i];
if ( bye == 0 ) break;
if ( bye%10 != 0 ) continue;
bye*=pw[i];
bye+= mo[i];
int hi = min(bye-x, pw[i]+ans);
if ( hi <= y ) {
ans = hi;
} else break;
}
return ans;
}
void tc () {
//nb=
int x = rnd(0, 1e18);
int y = rnd(x, 1e18);
int a = lockIN(x, y);
int b = bad(x, y);
if ( a == b ) cout << "GOOD\n";
else {
cout << "BAD ...\n";
cout << x << " " << y << "\n";
cout << a << " " << b << "\n";
exit(0);
}
}
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
}
}
CgojaWZkZWYgQXNhYWQKICAgICNpbmNsdWRlICJjcC5oIgogICAgI2RlZmluZSBkZWJ1ZyguLi4pIF9kYmdfbWFueSgjX19WQV9BUkdTX18sIF9fVkFfQVJHU19fKQogICAgI2RlZmluZSBoZXJlIGNlcnIgPDwgIkxJTkUgIiA8PCBfX0xJTkVfXyA8PCAiXG4iCiNlbHNlIAogICAgI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOwogICAgLyoKICAgICNpbmNsdWRlIDxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4KICAgICNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPgogICAgdXNpbmcgbmFtZXNwYWNlIF9fZ251X3BiZHM7CiAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgdXNpbmcgb3NldCA9IHRyZWU8VCwgbnVsbF90eXBlLCBsZXNzPFQ+LCByYl90cmVlX3RhZywgdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPjsKICAgICovCiAgICAjZGVmaW5lIGRlYnVnKC4uLikgCiAgICAjZGVmaW5lIGhlcmUgCiNlbmRpZgoKCgojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGludCBsb25nIGxvbmcKI2RlZmluZSBhbGwoeCkgeC5iZWdpbigpLCB4LmVuZCgpCiNkZWZpbmUgc2l6KHgpICgoaW50KXguc2l6ZSgpKQojZGVmaW5lIHllcyBjb3V0IDw8ICJZRVNcbiIKI2RlZmluZSBubyBjb3V0IDw8ICJOT1xuIgojZGVmaW5lIGYgZmlyc3QKI2RlZmluZSBzIHNlY29uZAojZGVmaW5lIGViIGVtcGxhY2VfYmFjawojZGVmaW5lIHBiIHB1c2hfYmFjawoKCmNvbnN0IGludCBtb2QgPSAxZTkrNzsKY29uc3QgaW50IE4gPSAyMDAwMDk7CmNvbnN0IGxvbmcgbG9uZyBpbmYgPSAxZTE4KzEyMzA5MTM4Owpkb3VibGUgZXBzID0gMWUtOTsKCm10MTk5Mzcgcm5nKCh1bnNpZ25lZCljaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkpOwoKaW50IHJuZChpbnQgbCwgaW50IHIpIHsKICAgIHJldHVybiB1bmlmb3JtX2ludF9kaXN0cmlidXRpb248aW50PihsLCByKShybmcpOwp9CgoKCgppbnQgZHBbMjBdWzJdWzJdWzJdOwppbnQgbG9ja0lOKGludCBuLCBpbnQgeCl7CiAgICAvL2xsIG4sIHg7Y2luPj5uPj54OwogICAgaWYoIW4pewogICAgICAgIGlmICggeCApIHJldHVybiAxTEw7CiAgICAgICAgcmV0dXJuIDBMTDsKICAgIH1tZW1zZXQoZHAsLTEsc2l6ZW9mKGRwKSk7CiAgICBzdHJpbmcgc2wgPSB0b19zdHJpbmcobik7CiAgICBzdHJpbmcgc3IgPSB0b19zdHJpbmcoeCk7CiAgICB3aGlsZShzbC5zaXplKCk8c3Iuc2l6ZSgpKXNsPScwJytzbDsKICAgIGludCBzeiA9IHNsLnNpemUoKTsKICAgIGF1dG8gZ28gPVsmXShhdXRvJiZnbyxpbnQgaWR4LCBpbnQgdWIsIGludCBsYiwgaW50IHopewogICAgICAgIGlmKGlkeD49c3opIHJldHVybiAwTEw7CiAgICAgICAgaW50IGxvID0gbGI/c2xbaWR4XS0nMCc6MDsKICAgICAgICBpbnQgaGkgPSB1Yj9zcltpZHhdLScwJzo5OwogICAgICAgIGludCZyZXQ9ZHBbaWR4XVt1Yl1bbGJdW3pdOwogICAgICAgIGlmKH5yZXQpIHJldHVybiByZXQ7CiAgICAgICAgcmV0PTEwMDsKICAgICAgICBmb3IoaW50IGkgPSBsbztpPD1oaTsrK2kpewogICAgICAgICAgICByZXQ9bWluKHJldCwoIXomJmk9PTApK2dvKGdvLGlkeCsxLHViJiYoaT09aGkpLGxiJiYoaT09bG8pLHomJihpPT0wKSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmV0OwogICAgfTsKICAgIGdvKGdvLDAsMSwxLDEpOwogICAgbGwgcmVzID0gMDsKICAgIGF1dG8gYnVpbGQgPVsmXShhdXRvJiZidWlsZCxpbnQgaWR4LGludCB1YiwgaW50IGxiLCBpbnQgeil7CiAgICAgICAgaWYoaWR4Pj1zeikgcmV0dXJuOwogICAgICAgIGludCBsbyA9IGxiP3NsW2lkeF0tJzAnOjA7CiAgICAgICAgaW50IGhpID0gdWI/c3JbaWR4XS0nMCc6OTsKICAgICAgICBpbnQgcmV0ID0gZHBbaWR4XVt1Yl1bbGJdW3pdOwogICAgICAgIGZvcihpbnQgaSA9IGxvO2k8PWhpOysraSl7CiAgICAgICAgICAgIGlmKHJldD09KCF6JiZpPT0wKStnbyhnbyxpZHgrMSx1YiYmKGk9PWhpKSxsYiYmKGk9PWxvKSx6JiYoaT09MCkpKXsKICAgICAgICAgICAgICAgIHJlcz1yZXMqMTAraTsKICAgICAgICAgICAgICAgIGJ1aWxkKGJ1aWxkLGlkeCsxLHViJiYoaT09aGkpLGxiJiYoaT09bG8pLHomJihpPT0wKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgfTsKICAgIGJ1aWxkKGJ1aWxkLDAsMSwxLDEpOwogICAgcmV0dXJuIHJlcy1uOwp9CgoKaW50IGJhZCAoaW50IHgsIGludCB5KSB7CiAgICAvL25iPQogICAgLy9pbnQgeCwgeTsKICAgIC8vY2luID4+IHggPj4geTsKICAgIHktPSB4OwogICAgaWYgKCB4ID09IDAgKSB7CiAgICAJcmV0dXJuIG1pbigxTEwsIHkpOwogICAgfQogICAgaW50IGFucyA9IDA7CiAgICB2ZWN0b3I8aW50PiBwdygxOSwgMSksIG1vKDE5LCAxKTsKICAgIGZvciAoaW50IGk9MTsgaTwxOTsgaSsrKSB7CiAgICAJcHdbaV0gPSBwd1tpLTFdKjEwOwogICAgCW1vW2ldID0gbW9baS0xXSoxMCsxOwogICAgfQogICAgZm9yIChpbnQgaT0wOyBpPDE5OyBpKyspIHsKICAgIAlpbnQgYnllID0geC9wd1tpXTsKICAgIAlpZiAoIGJ5ZSA9PSAwICkgYnJlYWs7CiAgICAJaWYgKCBieWUlMTAgIT0gMCApIGNvbnRpbnVlOwogICAgCWJ5ZSo9cHdbaV07CiAgICAJYnllKz0gbW9baV07CiAgICAJaW50IGhpID0gbWluKGJ5ZS14LCBwd1tpXSthbnMpOwogICAgCWlmICggaGkgPD0geSApIHsKICAgIAkJYW5zID0gaGk7CiAgICAJfSBlbHNlIGJyZWFrOwogICAgfQogICAgcmV0dXJuIGFuczsgIAoKfSAKCgoKCnZvaWQgdGMgKCkgewogICAgLy9uYj0KICAgIGludCB4ID0gcm5kKDAsIDFlMTgpOwogICAgaW50IHkgID0gcm5kKHgsIDFlMTgpOwogICAgaW50IGEgPSBsb2NrSU4oeCwgeSk7CiAgICBpbnQgYiA9IGJhZCh4LCB5KTsKICAgIGlmICggYSA9PSBiICkgY291dCA8PCAiR09PRFxuIjsKICAgIGVsc2UgewogICAgCWNvdXQgPDwgIkJBRCAuLi5cbiI7CiAgICAJY291dCA8PCB4IDw8ICIgIiA8PCB5IDw8ICJcbiI7CiAgICAJY291dCA8PCBhIDw8ICIgIiA8PCBiIDw8ICJcbiI7CiAgICAgICAgZXhpdCgwKTsKICAgIH0KCiAgICAKICAgIAoKfSAKCgoKCgpzaWduZWQgbWFpbiAoKSB7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKDApOwogICAgLy9mcmVvcGVuKCAiaW5wdXQudHh0IiwgInIiLCBzdGRpbiApOwogICAgLy9mcmVvcGVuKCAib3V0cHV0LnR4dCIsICJ3Iiwgc3Rkb3V0ICk7CiAgICAvL2NvdXQgPDwgZml4ZWQgPDwgc2V0cHJlY2lzaW9uKDkpOwogICAgLy9wcmUoKTsKICAgIGludCB0PTE7CiAgICBjaW4gPj4gdDsKICAgIAogICAgZm9yIChpbnQgaT0xOyBpPD10OyBpKyspIHsKICAgICAgICAjaWZkZWYgQXNhYWQKICAgICAgICAgICAgYXV0byBzdGFydCA9IGNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKICAgICAgICAgICAgLy9jb3V0IDw8ICItLS1DYXNlICIgPDwgaSA8PCAiIFN0YXJ0LS0tXG5cbiI7CiAgICAgICAgI2VuZGlmCgogICAgICAgIHRjKCk7CgoKICAgICAgICAjaWZkZWYgQXNhYWQKICAgICAgICAgICAgYXV0byBlbmQgPSBjaHJvbm86OmhpZ2hfcmVzb2x1dGlvbl9jbG9jazo6bm93KCk7CiAgICAgICAgICAgIC8vY291dCA8PCAiLS0tQ2FzZSAiIDw8IGkgPDwgIiBFbmQtLS1cbiI7CiAgICAgICAgICAgIC8vaWYgKCBpJTEwMDAwMCA9PSAwICkKICAgICAgICAgICAgY2VyciA8PCAiVGltZSAjIiA8PCBpIDw8ICI6ICIgPDwgY2hyb25vOjpkdXJhdGlvbl9jYXN0PGNocm9ubzo6bWlsbGlzZWNvbmRzPihlbmQgLSBzdGFydCkuY291bnQoKSA8PCAibXMiIDw8IGVuZGw7CiAgICAgICAgICAgIC8vY291dCA8PCAiLS0tLS0tLS0tLS0tLS1cbiI7CiAgICAgICAgI2VuZGlmCiAgICB9Cn0KCgoK