/*
* @Author: hungeazy
* @Date: 2025-11-19 09:06:49
* @Last Modified by: hungeazy
* @Last Modified time: 2025-11-19 13:20:09
*/
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")
// #pragma GCC target("avx2,bmi,bmi2,popcnt,lzcnt")
using namespace std;
using namespace __gnu_pbds;
bool M1;
#define fast ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
#define int long long
#define ll long long
#define ull unsigned long long
#define sz(x) x.size()
#define sqr(x) (1LL * (x) * (x))
#define all(x) x.begin(), x.end()
#define fill(f,x) memset(f,x,sizeof(f))
#define FOR(i,l,r) for(int i=l;i<=r;i++)
#define FOD(i,r,l) for(int i=r;i>=l;i--)
#define debug(x) cout << #x << " = " << x << '\n'
#define ii pair<int,int>
#define iii pair<int,ii>
#define di pair<ii,ii>
#define vi vector<int>
#define vii vector<ii>
#define mii map<int,int>
#define fi first
#define se second
#define pb push_back
#define MOD 1000000007
#define __lcm(a,b) (1ll * ((a) / __gcd((a), (b))) * (b))
#define YES cout << "YES\n"
#define NO cout << "NO\n"
#define MASK(i) (1LL << (i))
#define c_bit(i) __builtin_popcountll(i)
#define BIT(x,i) ((x) & MASK(i))
#define SET_ON(x,i) ((x) | MASK(i))
#define SET_OFF(x,i) ((x) & ~MASK(i))
#define oo 1e18
#define name ""
#define endl '\n'
#define memory() cerr << abs(&M2-&M1)/1024.0/1024 << " MB" << endl
#define time() cerr << endl << "-------------Time:" << 1000.0 * clock() / CLOCKS_PER_SEC << "ms." << endl
template<typename T> bool maximize(T &res, const T &val) { if (res < val){ res = val; return true; }; return false; }
template<typename T> bool minimize(T &res, const T &val) { if (res > val){ res = val; return true; }; return false; }
template <class T> using ordered_set = tree <T, null_type, less_equal <T>, rb_tree_tag,tree_order_statistics_node_update>;
const int N = (int)3e5+10;
int n,q;
struct Query {
int type,a,b,k;
} query[N];
namespace sub1 {
bool approved() {
return n <= 100 and q <= 100;
}
void solve(void)
{
multiset<int> st;
FOR(i,1,n) st.insert(1);
FOR(rep,1,q)
if (query[rep].type == 1)
{
int a = query[rep].a, b = query[rep].b;
if (st.find(a) != st.end())
st.erase(st.find(a));
if (st.find(b) != st.end())
st.erase(st.find(b));
st.insert(a+b);
}
else
{
int k = query[rep].k;
vi vec;
for (auto it = st.begin(); it != st.end(); it++)
for (auto it2 = next(it); it2 != st.end(); it2++)
vec.pb(abs(*it-*it2));
sort(all(vec));
cout << vec[k-1] << endl;
}
}
}
namespace sub4 {
int L[N],R[N],ans[N];
vi mem[N];
bool approved() {
int start = 0, last = 0;
FOR(i,1,q)
if (query[i].type == 1) last = i;
else
{
if (!start)
start = i;
}
return (last < start);
}
int count(vi &vec, int mid)
{
int n = sz(vec), cnt = 0, j = 0;
FOR(i,0,n-1)
{
if (j < i+1) j = i+1;
while (j < n and vec[j]-vec[i] <= mid) j++;
cnt += j-i-1;
}
return cnt;
}
void solve(void)
{
multiset<int> st;
FOR(i,1,n) st.insert(1);
int last;
FOR(rep,1,q)
if (query[rep].type == 1)
{
int a = query[rep].a, b = query[rep].b;
if (st.find(a) != st.end())
st.erase(st.find(a));
if (st.find(b) != st.end())
st.erase(st.find(b));
st.insert(a+b);
last = rep;
}
vi vec, K;
for (int x : st) vec.pb(x);
FOR(i,last+1,q)
if (query[i].type == 2)
{
int k = query[i].k;
K.pb(k);
}
int mx = vec.back()-vec.front(), len = sz(K);
FOR(i,0,len-1) L[i] = 0, R[i] = mx;
while (true)
{
bool check = false;
FOR(i,0,len-1)
if (L[i] <= R[i])
{
int mid = (L[i]+R[i])>>1;
mem[mid].pb(i);
check = true;
}
if (!check) break;
FOR(d,0,mx)
{
if (mem[d].empty()) continue;
int cnt = count(vec,d);
for (int id : mem[d])
if (cnt >= K[id]) ans[id] = d, R[id] = d-1;
else L[id] = d+1;
}
FOR(d,0,mx) mem[d].clear();
}
FOR(i,0,sz(K)-1) cout << ans[i] << endl;
}
}
namespace sub5 {
bool approved() {
return n <= 5e4 and q <= 5e4;
}
bool check(vi &a, int mid, int k)
{
int n = sz(a), cnt = 0, j = 0;
FOR(i,0,n-1)
{
if (j < i+1) j = i+1;
while (j < n and a[j]-a[i] <= mid) j++;
cnt += (j-i-1);
}
return (cnt >= k);
}
void solve(void)
{
vi vec;
FOR(i,1,n) vec.pb(1);
FOR(rep,1,q)
if (query[rep].type == 1)
{
int a = query[rep].a, b = query[rep].b;
auto it = lower_bound(all(vec),a);
if (it != vec.end()) vec.erase(it);
auto it2 = lower_bound(all(vec),b);
if (it2 != vec.end()) vec.erase(it2);
int x = a+b;
auto it3 = lower_bound(all(vec),x);
if (it3 == vec.end()) vec.pb(x);
else vec.insert(it3,x);
}
else
{
int k = query[rep].k;
int l = 0, r = vec.back()-vec.front(), ans = 0;
while (l <= r)
{
int mid = (l+r)>>1;
if (check(vec,mid,k)) ans = mid, r = mid-1;
else l = mid+1;
}
cout << ans << endl;
}
}
}
namespace sub6 {
int pre[N];
bool check(vii &vec, int mid, int k)
{
int n = sz(vec), j = 0, res = 0;
FOR(i,0,n-1)
{
if (j < i+1) j = i+1;
while (j < n and vec[j].fi-vec[i].fi <= mid) j++;
if (j-1 >= i+1)
res += vec[i].se*(pre[j-1]-pre[i]);
}
return (res >= k);
}
void solve(void)
{
unordered_map<int,int> mp;
mp[1] = n;
FOR(rep,1,q)
if (query[rep].type == 1)
{
int a = query[rep].a, b = query[rep].b;
auto it1 = mp.find(a);
if (!(it1 == mp.end() or !it1->se))
{
it1->se--;
if (!it1->se) mp.erase(it1);
}
auto it2 = mp.find(b);
if (!(it2 == mp.end() or !it2->se))
{
it2->se--;
if (!it2->se) mp.erase(it2);
}
int val = a+b;
mp[val]++;
}
else
{
int k = query[rep].k;
vii vec;
for (auto x : mp)
if (x.se) vec.pb(x);
sort(all(vec));
int m = sz(vec);
if (m == 1)
{
cout << 0 << endl;
continue;
}
int same = 0;
for (auto x : mp) same += x.se*(x.se-1)/2;
if (k <= same)
{
cout << 0 << endl;
continue;
}
k -= same;
pre[0] = vec[0].se;
FOR(i,1,m-1) pre[i] = pre[i-1]+vec[i].se;
int l = 1, r = vec.back().fi-vec.front().fi, ans;
while (l <= r)
{
int mid = (l+r)>>1;
if (check(vec,mid,k)) ans = mid, r = mid-1;
else l = mid+1;
}
cout << ans << endl;
}
}
}
bool M2;
signed main()
{
fast;
if (fopen(name".inp","r"))
{
freopen(name".inp","r",stdin);
freopen(name".out","w",stdout);
}
cin >> n >> q;
FOR(i,1,q)
{
cin >> query[i].type;
if (query[i].type == 1)
cin >> query[i].a >> query[i].b;
else cin >> query[i].k;
}
// if (sub1::approved()) return sub1::solve(), time(), memory(), 0;
// if (sub4::approved()) return sub4::solve(), time(), memory(), 0;
if (sub5::approved()) return sub5::solve(), time(), memory(), 0;
sub6::solve();
time();
memory();
return 0;
}
// ██░ ██ █ ██ ███▄ █ ▄████
//▓██░ ██▒ ██ ▓██▒ ██ ▀█ █ ██▒ ▀█▒
//▒██▀▀██░▓██ ▒██░▓██ ▀█ ██▒▒██░▄▄▄░
//░▓█ ░██ ▓▓█ ░██░▓██▒ ▐▌██▒░▓█ ██▓
//░▓█▒░██▓▒▒█████▓ ▒██░ ▓██░░▒▓███▀▒
// ▒ ░░▒░▒░▒▓▒ ▒ ▒ ░ ▒░ ▒ ▒ ░▒ ▒
// ▒ ░▒░ ░░░▒░ ░ ░ ░ ░░ ░ ▒░ ░ ░
// ░ ░░ ░ ░░░ ░ ░ ░ ░ ░ ░ ░ ░
// ░ ░ ░ ░ ░ ░
LyoKKiBAQXV0aG9yOiBodW5nZWF6eQoqIEBEYXRlOiAgIDIwMjUtMTEtMTkgMDk6MDY6NDkKKiBATGFzdCBNb2RpZmllZCBieTogICBodW5nZWF6eQoqIEBMYXN0IE1vZGlmaWVkIHRpbWU6IDIwMjUtMTEtMTkgMTM6MjA6MDkKKi8KI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxleHQvcGJfZHMvYXNzb2NfY29udGFpbmVyLmhwcD4gCiNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPiAKLy8gI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8zIikgIAovLyAjcHJhZ21hIEdDQyBvcHRpbWl6ZSgidW5yb2xsLWxvb3BzIikgIAovLyAjcHJhZ21hIEdDQyB0YXJnZXQoImF2eDIsYm1pLGJtaTIscG9wY250LGx6Y250IikgIAp1c2luZyBuYW1lc3BhY2Ugc3RkOwp1c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsgCmJvb2wgTTE7CiNkZWZpbmUgZmFzdCBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsgY2luLnRpZShOVUxMKTsgY291dC50aWUoTlVMTCk7CiNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIGxsIGxvbmcgbG9uZyAKI2RlZmluZSB1bGwgdW5zaWduZWQgbG9uZyBsb25nCiNkZWZpbmUgc3ooeCkgeC5zaXplKCkKI2RlZmluZSBzcXIoeCkgKDFMTCAqICh4KSAqICh4KSkKI2RlZmluZSBhbGwoeCkgeC5iZWdpbigpLCB4LmVuZCgpCiNkZWZpbmUgZmlsbChmLHgpIG1lbXNldChmLHgsc2l6ZW9mKGYpKQojZGVmaW5lIEZPUihpLGwscikgZm9yKGludCBpPWw7aTw9cjtpKyspCiNkZWZpbmUgRk9EKGkscixsKSBmb3IoaW50IGk9cjtpPj1sO2ktLSkKI2RlZmluZSBkZWJ1Zyh4KSBjb3V0IDw8ICN4IDw8ICIgPSAiIDw8IHggPDwgJ1xuJwojZGVmaW5lIGlpIHBhaXI8aW50LGludD4KI2RlZmluZSBpaWkgcGFpcjxpbnQsaWk+CiNkZWZpbmUgZGkgcGFpcjxpaSxpaT4KI2RlZmluZSB2aSB2ZWN0b3I8aW50PgojZGVmaW5lIHZpaSB2ZWN0b3I8aWk+CiNkZWZpbmUgbWlpIG1hcDxpbnQsaW50PgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgTU9EIDEwMDAwMDAwMDcKI2RlZmluZSBfX2xjbShhLGIpICgxbGwgKiAoKGEpIC8gX19nY2QoKGEpLCAoYikpKSAqIChiKSkKI2RlZmluZSBZRVMgY291dCA8PCAiWUVTXG4iCiNkZWZpbmUgTk8gY291dCA8PCAiTk9cbiIKI2RlZmluZSBNQVNLKGkpICgxTEwgPDwgKGkpKQojZGVmaW5lIGNfYml0KGkpIF9fYnVpbHRpbl9wb3Bjb3VudGxsKGkpCiNkZWZpbmUgQklUKHgsaSkgKCh4KSAmIE1BU0soaSkpCiNkZWZpbmUgU0VUX09OKHgsaSkgKCh4KSB8IE1BU0soaSkpCiNkZWZpbmUgU0VUX09GRih4LGkpICgoeCkgJiB+TUFTSyhpKSkKI2RlZmluZSBvbyAxZTE4CiNkZWZpbmUgbmFtZSAiIgojZGVmaW5lIGVuZGwgJ1xuJwojZGVmaW5lIG1lbW9yeSgpIGNlcnIgPDwgYWJzKCZNMi0mTTEpLzEwMjQuMC8xMDI0IDw8ICIgTUIiIDw8IGVuZGwKI2RlZmluZSB0aW1lKCkgY2VyciA8PCBlbmRsIDw8ICItLS0tLS0tLS0tLS0tVGltZToiIDw8IDEwMDAuMCAqIGNsb2NrKCkgLyBDTE9DS1NfUEVSX1NFQyA8PCAibXMuIiA8PCBlbmRsCnRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgbWF4aW1pemUoVCAmcmVzLCBjb25zdCBUICZ2YWwpIHsgaWYgKHJlcyA8IHZhbCl7IHJlcyA9IHZhbDsgcmV0dXJuIHRydWU7IH07IHJldHVybiBmYWxzZTsgfQp0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIG1pbmltaXplKFQgJnJlcywgY29uc3QgVCAmdmFsKSB7IGlmIChyZXMgPiB2YWwpeyByZXMgPSB2YWw7IHJldHVybiB0cnVlOyB9OyByZXR1cm4gZmFsc2U7IH0KdGVtcGxhdGUgPGNsYXNzIFQ+IHVzaW5nIG9yZGVyZWRfc2V0ID0gdHJlZSA8VCwgbnVsbF90eXBlLCBsZXNzX2VxdWFsIDxUPiwgcmJfdHJlZV90YWcsdHJlZV9vcmRlcl9zdGF0aXN0aWNzX25vZGVfdXBkYXRlPjsKY29uc3QgaW50IE4gPSAoaW50KTNlNSsxMDsKaW50IG4scTsKCnN0cnVjdCBRdWVyeSB7CglpbnQgdHlwZSxhLGIsazsKfSBxdWVyeVtOXTsKCm5hbWVzcGFjZSBzdWIxIHsKCglib29sIGFwcHJvdmVkKCkgewoJCXJldHVybiBuIDw9IDEwMCBhbmQgcSA8PSAxMDA7Cgl9CgoJdm9pZCBzb2x2ZSh2b2lkKQoJewoJCW11bHRpc2V0PGludD4gc3Q7CgkJRk9SKGksMSxuKSBzdC5pbnNlcnQoMSk7CgkJRk9SKHJlcCwxLHEpCgkJCWlmIChxdWVyeVtyZXBdLnR5cGUgPT0gMSkKCQkJewoJCQkJaW50IGEgPSBxdWVyeVtyZXBdLmEsIGIgPSBxdWVyeVtyZXBdLmI7CgkJCQlpZiAoc3QuZmluZChhKSAhPSBzdC5lbmQoKSkKCQkJCQlzdC5lcmFzZShzdC5maW5kKGEpKTsKCQkJCWlmIChzdC5maW5kKGIpICE9IHN0LmVuZCgpKQoJCQkJCXN0LmVyYXNlKHN0LmZpbmQoYikpOwoJCQkJc3QuaW5zZXJ0KGErYik7CgkJCX0KCQkJZWxzZSAKCQkJewoJCQkJaW50IGsgPSBxdWVyeVtyZXBdLms7CgkJCQl2aSB2ZWM7CgkJCQlmb3IgKGF1dG8gaXQgPSBzdC5iZWdpbigpOyBpdCAhPSBzdC5lbmQoKTsgaXQrKykKCQkJCQlmb3IgKGF1dG8gaXQyID0gbmV4dChpdCk7IGl0MiAhPSBzdC5lbmQoKTsgaXQyKyspIAoJCQkJCQl2ZWMucGIoYWJzKCppdC0qaXQyKSk7CgkJCQlzb3J0KGFsbCh2ZWMpKTsKCQkJCWNvdXQgPDwgdmVjW2stMV0gPDwgZW5kbDsKCQkJfQoJfQoJCn0KCm5hbWVzcGFjZSBzdWI0IHsKCglpbnQgTFtOXSxSW05dLGFuc1tOXTsKCXZpIG1lbVtOXTsKCglib29sIGFwcHJvdmVkKCkgewoJCWludCBzdGFydCA9IDAsIGxhc3QgPSAwOwoJCUZPUihpLDEscSkKCQkJaWYgKHF1ZXJ5W2ldLnR5cGUgPT0gMSkgbGFzdCA9IGk7CgkJCWVsc2UgCgkJCXsKCQkJCWlmICghc3RhcnQpCgkJCQkJc3RhcnQgPSBpOwoJCQl9CgkJcmV0dXJuIChsYXN0IDwgc3RhcnQpOwoJfQoKCWludCBjb3VudCh2aSAmdmVjLCBpbnQgbWlkKQoJewoJCWludCBuID0gc3oodmVjKSwgY250ID0gMCwgaiA9IDA7CgkJRk9SKGksMCxuLTEpCgkJewoJCQlpZiAoaiA8IGkrMSkgaiA9IGkrMTsKCQkJd2hpbGUgKGogPCBuIGFuZCB2ZWNbal0tdmVjW2ldIDw9IG1pZCkgaisrOwoJCQljbnQgKz0gai1pLTE7CgkJfQoJCXJldHVybiBjbnQ7Cgl9CgoJdm9pZCBzb2x2ZSh2b2lkKQoJewoJCW11bHRpc2V0PGludD4gc3Q7CgkJRk9SKGksMSxuKSBzdC5pbnNlcnQoMSk7CgkJaW50IGxhc3Q7CgkJRk9SKHJlcCwxLHEpCgkJCWlmIChxdWVyeVtyZXBdLnR5cGUgPT0gMSkKCQkJewoJCQkJaW50IGEgPSBxdWVyeVtyZXBdLmEsIGIgPSBxdWVyeVtyZXBdLmI7CgkJCQlpZiAoc3QuZmluZChhKSAhPSBzdC5lbmQoKSkKCQkJCQlzdC5lcmFzZShzdC5maW5kKGEpKTsKCQkJCWlmIChzdC5maW5kKGIpICE9IHN0LmVuZCgpKQoJCQkJCXN0LmVyYXNlKHN0LmZpbmQoYikpOwoJCQkJc3QuaW5zZXJ0KGErYik7CgkJCQlsYXN0ID0gcmVwOwoJCQl9CgkJdmkgdmVjLCBLOwoJCWZvciAoaW50IHggOiBzdCkgdmVjLnBiKHgpOwoJCUZPUihpLGxhc3QrMSxxKQoJCQlpZiAocXVlcnlbaV0udHlwZSA9PSAyKSAKCQkJewoJCQkJaW50IGsgPSBxdWVyeVtpXS5rOwoJCQkJSy5wYihrKTsKCQkJfQoJCWludCBteCA9IHZlYy5iYWNrKCktdmVjLmZyb250KCksIGxlbiA9IHN6KEspOwoJCUZPUihpLDAsbGVuLTEpIExbaV0gPSAwLCBSW2ldID0gbXg7CgkJd2hpbGUgKHRydWUpCgkJewoJCQlib29sIGNoZWNrID0gZmFsc2U7CgkJCUZPUihpLDAsbGVuLTEpCgkJCQlpZiAoTFtpXSA8PSBSW2ldKQoJCQkJewoJCQkJCWludCBtaWQgPSAoTFtpXStSW2ldKT4+MTsKCQkJCQltZW1bbWlkXS5wYihpKTsKCQkJCQljaGVjayA9IHRydWU7CgkJCQl9CgkJCWlmICghY2hlY2spIGJyZWFrOwoJCQlGT1IoZCwwLG14KQoJCQl7CgkJCQlpZiAobWVtW2RdLmVtcHR5KCkpIGNvbnRpbnVlOwoJCQkJaW50IGNudCA9IGNvdW50KHZlYyxkKTsKCQkJCWZvciAoaW50IGlkIDogbWVtW2RdKQoJCQkJCWlmIChjbnQgPj0gS1tpZF0pIGFuc1tpZF0gPSBkLCBSW2lkXSA9IGQtMTsKCQkJCQllbHNlIExbaWRdID0gZCsxOyAKCQkJfQoJCQlGT1IoZCwwLG14KSBtZW1bZF0uY2xlYXIoKTsKCQl9CgkJRk9SKGksMCxzeihLKS0xKSBjb3V0IDw8IGFuc1tpXSA8PCBlbmRsOwoJfQoKfQoKbmFtZXNwYWNlIHN1YjUgewoKCWJvb2wgYXBwcm92ZWQoKSB7CgkJcmV0dXJuIG4gPD0gNWU0IGFuZCBxIDw9IDVlNDsKCX0KCglib29sIGNoZWNrKHZpICZhLCBpbnQgbWlkLCBpbnQgaykKCXsKCQlpbnQgbiA9IHN6KGEpLCBjbnQgPSAwLCBqID0gMDsKCQlGT1IoaSwwLG4tMSkKCQl7CgkJCWlmIChqIDwgaSsxKSBqID0gaSsxOwoJCQl3aGlsZSAoaiA8IG4gYW5kIGFbal0tYVtpXSA8PSBtaWQpIGorKzsKCQkJY250ICs9IChqLWktMSk7CgkJfQoJCXJldHVybiAoY250ID49IGspOwoJfQoKCXZvaWQgc29sdmUodm9pZCkKCXsKCQl2aSB2ZWM7CgkJRk9SKGksMSxuKSB2ZWMucGIoMSk7CgkJRk9SKHJlcCwxLHEpCgkJCWlmIChxdWVyeVtyZXBdLnR5cGUgPT0gMSkKCQkJewoJCQkJaW50IGEgPSBxdWVyeVtyZXBdLmEsIGIgPSBxdWVyeVtyZXBdLmI7CgkJCQlhdXRvIGl0ID0gbG93ZXJfYm91bmQoYWxsKHZlYyksYSk7CgkJCQlpZiAoaXQgIT0gdmVjLmVuZCgpKSB2ZWMuZXJhc2UoaXQpOwoJCQkJYXV0byBpdDIgPSBsb3dlcl9ib3VuZChhbGwodmVjKSxiKTsKCQkJCWlmIChpdDIgIT0gdmVjLmVuZCgpKSB2ZWMuZXJhc2UoaXQyKTsKCQkJCWludCB4ID0gYStiOwoJCQkJYXV0byBpdDMgPSBsb3dlcl9ib3VuZChhbGwodmVjKSx4KTsKCQkJCWlmIChpdDMgPT0gdmVjLmVuZCgpKSB2ZWMucGIoeCk7CgkJCQllbHNlIHZlYy5pbnNlcnQoaXQzLHgpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJaW50IGsgPSBxdWVyeVtyZXBdLms7CgkJCQlpbnQgbCA9IDAsIHIgPSB2ZWMuYmFjaygpLXZlYy5mcm9udCgpLCBhbnMgPSAwOwoJCQkJd2hpbGUgKGwgPD0gcikKCQkJCXsKCQkJCQlpbnQgbWlkID0gKGwrcik+PjE7CgkJCQkJaWYgKGNoZWNrKHZlYyxtaWQsaykpIGFucyA9IG1pZCwgciA9IG1pZC0xOwoJCQkJCWVsc2UgbCA9IG1pZCsxOwoJCQkJfQoJCQkJY291dCA8PCBhbnMgPDwgZW5kbDsKCQkJfQoJfQoKfQoKbmFtZXNwYWNlIHN1YjYgewoKCWludCBwcmVbTl07CgoJYm9vbCBjaGVjayh2aWkgJnZlYywgaW50IG1pZCwgaW50IGspCgl7CgkJaW50IG4gPSBzeih2ZWMpLCBqID0gMCwgcmVzID0gMDsKCQlGT1IoaSwwLG4tMSkKCQl7CgkJCWlmIChqIDwgaSsxKSBqID0gaSsxOwoJCQl3aGlsZSAoaiA8IG4gYW5kIHZlY1tqXS5maS12ZWNbaV0uZmkgPD0gbWlkKSBqKys7CgkJCWlmIChqLTEgPj0gaSsxKQoJCQkJcmVzICs9IHZlY1tpXS5zZSoocHJlW2otMV0tcHJlW2ldKTsKCQl9CgkJcmV0dXJuIChyZXMgPj0gayk7Cgl9CgoJdm9pZCBzb2x2ZSh2b2lkKQoJewoJCXVub3JkZXJlZF9tYXA8aW50LGludD4gbXA7CgkJbXBbMV0gPSBuOwoJCUZPUihyZXAsMSxxKQoJCQlpZiAocXVlcnlbcmVwXS50eXBlID09IDEpCgkJCXsKCQkJCWludCBhID0gcXVlcnlbcmVwXS5hLCBiID0gcXVlcnlbcmVwXS5iOwoJCQkJYXV0byBpdDEgPSBtcC5maW5kKGEpOwoJCQkJaWYgKCEoaXQxID09IG1wLmVuZCgpIG9yICFpdDEtPnNlKSkKCQkJCXsKCQkJCQlpdDEtPnNlLS07CgkJCQkJaWYgKCFpdDEtPnNlKSBtcC5lcmFzZShpdDEpOwoJCQkJfQoJCQkJYXV0byBpdDIgPSBtcC5maW5kKGIpOwoJCQkJaWYgKCEoaXQyID09IG1wLmVuZCgpIG9yICFpdDItPnNlKSkKCQkJCXsKCQkJCQlpdDItPnNlLS07CgkJCQkJaWYgKCFpdDItPnNlKSBtcC5lcmFzZShpdDIpOwoJCQkJfQoJCQkJaW50IHZhbCA9IGErYjsKCQkJCW1wW3ZhbF0rKzsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCWludCBrID0gcXVlcnlbcmVwXS5rOwoJCQkJdmlpIHZlYzsKCQkJCWZvciAoYXV0byB4IDogbXApCgkJCQkJaWYgKHguc2UpIHZlYy5wYih4KTsKCQkJCXNvcnQoYWxsKHZlYykpOwoJCQkJaW50IG0gPSBzeih2ZWMpOwoJCQkJaWYgKG0gPT0gMSkKCQkJCXsKCQkJCQljb3V0IDw8IDAgPDwgZW5kbDsKCQkJCQljb250aW51ZTsKCQkJCX0KCQkJCWludCBzYW1lID0gMDsKCQkJCWZvciAoYXV0byB4IDogbXApIHNhbWUgKz0geC5zZSooeC5zZS0xKS8yOwoJCQkJaWYgKGsgPD0gc2FtZSkgCgkJCQl7CgkJCQkJY291dCA8PCAwIDw8IGVuZGw7CgkJCQkJY29udGludWU7CgkJCQl9CgkJCQlrIC09IHNhbWU7CgkJCQlwcmVbMF0gPSB2ZWNbMF0uc2U7CgkJCQlGT1IoaSwxLG0tMSkgcHJlW2ldID0gcHJlW2ktMV0rdmVjW2ldLnNlOwoJCQkJaW50IGwgPSAxLCByID0gdmVjLmJhY2soKS5maS12ZWMuZnJvbnQoKS5maSwgYW5zOwoJCQkJd2hpbGUgKGwgPD0gcikKCQkJCXsKCQkJCQlpbnQgbWlkID0gKGwrcik+PjE7CgkJCQkJaWYgKGNoZWNrKHZlYyxtaWQsaykpIGFucyA9IG1pZCwgciA9IG1pZC0xOwoJCQkJCWVsc2UgbCA9IG1pZCsxOwoJCQkJfQoJCQkJY291dCA8PCBhbnMgPDwgZW5kbDsKCQkJfQoJfQoKfQoKYm9vbCBNMjsKc2lnbmVkIG1haW4oKQp7CiAgICBmYXN0OwogICAgaWYgKGZvcGVuKG5hbWUiLmlucCIsInIiKSkKICAgIHsKICAgIAlmcmVvcGVuKG5hbWUiLmlucCIsInIiLHN0ZGluKTsKICAgIAlmcmVvcGVuKG5hbWUiLm91dCIsInciLHN0ZG91dCk7CiAgICB9CiAgICBjaW4gPj4gbiA+PiBxOwogICAgRk9SKGksMSxxKQogICAgewogICAgCWNpbiA+PiBxdWVyeVtpXS50eXBlOwogICAgCWlmIChxdWVyeVtpXS50eXBlID09IDEpCiAgICAJCWNpbiA+PiBxdWVyeVtpXS5hID4+IHF1ZXJ5W2ldLmI7CiAgICAJZWxzZSBjaW4gPj4gcXVlcnlbaV0uazsKICAgIH0KICAgIC8vIGlmIChzdWIxOjphcHByb3ZlZCgpKSByZXR1cm4gc3ViMTo6c29sdmUoKSwgdGltZSgpLCBtZW1vcnkoKSwgMDsKICAgIC8vIGlmIChzdWI0OjphcHByb3ZlZCgpKSByZXR1cm4gc3ViNDo6c29sdmUoKSwgdGltZSgpLCBtZW1vcnkoKSwgMDsKICAgIGlmIChzdWI1OjphcHByb3ZlZCgpKSByZXR1cm4gc3ViNTo6c29sdmUoKSwgdGltZSgpLCBtZW1vcnkoKSwgMDsKICAgIHN1YjY6OnNvbHZlKCk7CiAgICB0aW1lKCk7CiAgICBtZW1vcnkoKTsKICAgIHJldHVybiAwOwp9Ci8vIOKWiOKWiOKWkSDilojiloggIOKWiCAgICDilojiloggIOKWiOKWiOKWiOKWhCAgICDiloggICDiloTilojilojilojilogKLy/ilpPilojilojilpEg4paI4paI4paSIOKWiOKWiCAg4paT4paI4paI4paSIOKWiOKWiCDiloDiloggICDiloggIOKWiOKWiOKWkiDiloDilojilpIKLy/ilpLilojilojiloDiloDilojilojilpHilpPilojiloggIOKWkuKWiOKWiOKWkeKWk+KWiOKWiCAg4paA4paIIOKWiOKWiOKWkuKWkuKWiOKWiOKWkeKWhOKWhOKWhOKWkQovL+KWkeKWk+KWiCDilpHilojilogg4paT4paT4paIICDilpHilojilojilpHilpPilojilojilpIgIOKWkOKWjOKWiOKWiOKWkuKWkeKWk+KWiCAg4paI4paI4paTCi8v4paR4paT4paI4paS4paR4paI4paI4paT4paS4paS4paI4paI4paI4paI4paI4paTIOKWkuKWiOKWiOKWkSAgIOKWk+KWiOKWiOKWkeKWkeKWkuKWk+KWiOKWiOKWiOKWgOKWkgovLyDilpIg4paR4paR4paS4paR4paS4paR4paS4paT4paSIOKWkiDilpIg4paRIOKWkuKWkSAgIOKWkiDilpIgIOKWkeKWkiAgIOKWkgovLyDilpIg4paR4paS4paRIOKWkeKWkeKWkeKWkuKWkSDilpEg4paRIOKWkSDilpHilpEgICDilpEg4paS4paRICDilpEgICDilpEKLy8g4paRICDilpHilpEg4paRIOKWkeKWkeKWkSDilpEg4paRICAgIOKWkSAgIOKWkSDilpEg4paRIOKWkSAgIOKWkQovLyDilpEgIOKWkSAg4paRICAg4paRICAgICAgICAgICAgICDilpEgICAgICAg4paR