/// KoJa
#include <bits/stdc++.h>
using namespace std;
#define task "test"
#define pb push_back
#define SZ(a) (a).begin(), (a).end()
#define SZZ(a, Begin, End) (a) + (Begin), (a) + (Begin) + (End)
#define BIT(a) (1LL << (a))
#define vec vector
#define fi first
#define se second
#define mp make_pair
#define MASK(x, i) (((x) >> (i))&1)
typedef long long ll;
typedef pair<int, int> ii;
template <class T>
inline bool maximize(T &a, const T &b) { return (a < b ? (a = b, 1) : 0); }
template <class T>
inline bool minimize(T &a, const T &b) { return (a > b ? (a = b, 1) : 0); }
void fastio()
{
ios_base::sync_with_stdio(NULL);
cin.tie(NULL);
if (fopen(task ".inp", "r"))
{
freopen(task ".inp", "r", stdin);
freopen(task ".out", "w", stdout);
}
else if (fopen(task ".in", "r"))
{
freopen(task ".in", "r", stdin);
freopen(task ".out", "w", stdout);
}
}
const int N = int(1e6) + 5;
const ll INF = 1e18;
int n, m;
struct Rectangle
{
int x, y, u, v;
Rectangle(){}
Rectangle(int _x, int _y, int _u, int _v)
{
x = _x;
y = _y;
u = _u;
v = _v;
}
} rect[N], queries[N];
struct Line
{
int x, l, r, id, type;
Line(){}
Line(int _x, int _l, int _r, int _id, int _type)
{
x = _x;
l = _l;
r = _r;
id = _id;
type = _type;
}
bool operator < (const Line &other) { return ((x < other.x)||((x == other.x)&&(type < other.type)));}
};
vec<ii> points;
vec<int> val;
vec<Line> sweepline;
void init()
{
cin >> n >> m;
++n;
rect[1] = Rectangle(-1e9, -1e9, 1e9, 1e9);
val.pb(-1e9);
val.pb(1e9);
for(int i = 2; i <= n; i++)
{
cin >> rect[i].x >> rect[i].y >> rect[i].u >> rect[i].v;
val.pb(rect[i].y);
val.pb(rect[i].v);
}
for(int i = 1; i <= m; i++)
{
cin >> queries[i].x >> queries[i].y >> queries[i].u >> queries[i].v;
val.pb(queries[i].y);
val.pb(queries[i].v);
}
}
vec<vec<int>> adj(N);
int depth[N], par[N][20], parPoints[N];
void dfs(int u, int p)
{
for(int v : adj[u])
{
if(v == p)
continue;
par[v][0] = u;
depth[v] = depth[u] + 1;
dfs(v, u);
}
}
int lca(int u, int v)
{
if(depth[u] < depth[v])
swap(u, v);
for(int i = 19; i >= 0; i--)
if(depth[par[u][i]] >= depth[v])
u = par[u][i];
if(u == v)
return u;
for(int i = 19; i >= 0; i--)
if(par[u][i] != par[v][i])
{
u = par[u][i];
v = par[v][i];
}
return par[u][0];
}
int getDist(int u, int v)
{
return depth[u] + depth[v] - 2 * depth[lca(u, v)];
}
ii qu[N];
class SegmentTree
{
private:
int n;
vec<int> st, lz;
void pushDown(int id)
{
if(lz[id] == 0)
return;
st[2 * id] = lz[id];
st[2 * id + 1] = lz[id];
lz[2 * id] = lz[id];
lz[2 *id + 1] = lz[id];
lz[id] = 0;
}
void update(int u, int v, int val, int l, int r, int id)
{
if((u > v)||(l > r)||(l > v)||(u > r))
return;
if((u <= l)&&(r <= v))
{
st[id] = val;
lz[id] = val;
return;
}
pushDown(id);
int mid = (l + r) >> 1;
update(u, v, val, l, mid, 2*id);
update(u, v, val, mid + 1, r, 2*id + 1);
if(st[2 * id])
st[id] = st[2 * id];
if(st[2*id + 1])
st[id] = st[2*id + 1];
}
int getVal(int pos, int l, int r, int id)
{
if((l > r)||(l > pos)||(pos > r))
return 0;
if(l == r)
return st[id];
pushDown(id);
int mid = (l + r) >> 1;
int res = 0;
if(pos <= mid)
res = max(res, getVal(pos, l, mid, 2*id));
else
res = max(res, getVal(pos, mid + 1, r, 2*id + 1));
return res;
}
public:
SegmentTree(int _n = 0)
{
this->n = _n;
st = lz = vec<int>(4 * n + 7, 0);
}
void update(int l, int r, int val) { return update(l, r, val, 1, n, 1);}
int getVal(int pos) { return getVal(pos, 1, n, 1);}
} it;
void process(const int &tc)
{
sort(SZ(val));
val.erase(unique(SZ(val)), val.end());
for(int i = 1; i <= m; i++)
{
queries[i].y = lower_bound(SZ(val), queries[i].y) - val.begin() + 1;
queries[i].v = lower_bound(SZ(val), queries[i].v) - val.begin() + 1;
points.pb(ii(queries[i].x, queries[i].y));
points.pb(ii(queries[i].u, queries[i].v));
}
sort(SZ(points));
points.erase(unique(SZ(points)), points.end());
for(int i = 1; i <= n; i++)
{
rect[i].y = lower_bound(SZ(val), rect[i].y) - val.begin() + 1;
rect[i].v = lower_bound(SZ(val), rect[i].v) - val.begin() + 1;
sweepline.pb(Line(rect[i].x, rect[i].y, rect[i].v, i, 0));
sweepline.pb(Line(rect[i].u, rect[i].y, rect[i].v, i, 2));
}
for(int i = 1; i <= m; i++)
{
int id1 = lower_bound(SZ(points), ii(queries[i].x, queries[i].y)) - points.begin() + 1;
int id2 = lower_bound(SZ(points), ii(queries[i].u, queries[i].v)) - points.begin() + 1;
qu[i] = ii(id1, id2);
}
for(int i = 1; i <= (int)points.size(); i++)
sweepline.pb(Line(points[i - 1].fi, points[i - 1].se, points[i - 1].se, i, 1));
sort(SZ(sweepline));
it = SegmentTree((int)val.size());
for(auto &x : sweepline) {
if(x.type == 2)
{
it.update(x.l, x.r, par[x.id][0]);
}
else
{
int u = it.getVal(x.r);
if(u != 0)
{
if(x.type == 0)
{
par[x.id][0] = u;
adj[x.id].pb(u);
adj[u].pb(x.id);
}
else
parPoints[x.id] = u;
}
if(x.type == 0)
{
it.update(x.l, x.r, x.id);
}
}
}
depth[0] = -1;
depth[1] = 0;
dfs(1, -1);
for(int i = 1; i < 20; i++)
for(int u = 1; u <= n + 1; u++)
par[u][i] = par[par[u][i - 1]][i - 1];
for(int i = 1; i <= m; i++)
cout << getDist(parPoints[qu[i].fi], parPoints[qu[i].se]) << '\n';
}
int main()
{
fastio();
int t = 1;
// cin >> t;
for (int i = 1; i <= t; i++)
{
init();
process(i);
}
return 0;
}
/*
l <= u && v <= r
*/
Ly8vIEtvSmEKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgdGFzayAidGVzdCIKI2RlZmluZSBwYiBwdXNoX2JhY2sKI2RlZmluZSBTWihhKSAoYSkuYmVnaW4oKSwgKGEpLmVuZCgpCiNkZWZpbmUgU1paKGEsIEJlZ2luLCBFbmQpIChhKSArIChCZWdpbiksIChhKSArIChCZWdpbikgKyAoRW5kKQojZGVmaW5lIEJJVChhKSAoMUxMIDw8IChhKSkKI2RlZmluZSB2ZWMgdmVjdG9yCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBtcCBtYWtlX3BhaXIKI2RlZmluZSBNQVNLKHgsIGkpICgoKHgpID4+IChpKSkmMSkKCnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IGlpOwoKdGVtcGxhdGUgPGNsYXNzIFQ+CmlubGluZSBib29sIG1heGltaXplKFQgJmEsIGNvbnN0IFQgJmIpIHsgcmV0dXJuIChhIDwgYiA/IChhID0gYiwgMSkgOiAwKTsgfQp0ZW1wbGF0ZSA8Y2xhc3MgVD4KaW5saW5lIGJvb2wgbWluaW1pemUoVCAmYSwgY29uc3QgVCAmYikgeyByZXR1cm4gKGEgPiBiID8gKGEgPSBiLCAxKSA6IDApOyB9CnZvaWQgZmFzdGlvKCkKewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhOVUxMKTsKICAgIGNpbi50aWUoTlVMTCk7CiAgICBpZiAoZm9wZW4odGFzayAiLmlucCIsICJyIikpCiAgICB7CiAgICAgICAgZnJlb3Blbih0YXNrICIuaW5wIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3Blbih0YXNrICIub3V0IiwgInciLCBzdGRvdXQpOwogICAgfQogICAgZWxzZSBpZiAoZm9wZW4odGFzayAiLmluIiwgInIiKSkKICAgIHsKICAgICAgICBmcmVvcGVuKHRhc2sgIi5pbiIsICJyIiwgc3RkaW4pOwogICAgICAgIGZyZW9wZW4odGFzayAiLm91dCIsICJ3Iiwgc3Rkb3V0KTsKICAgIH0KfQpjb25zdCBpbnQgTiA9IGludCgxZTYpICsgNTsKY29uc3QgbGwgSU5GID0gMWUxODsKaW50IG4sIG07CnN0cnVjdCBSZWN0YW5nbGUKewogICAgaW50IHgsIHksIHUsIHY7CiAgICBSZWN0YW5nbGUoKXt9CiAgICBSZWN0YW5nbGUoaW50IF94LCBpbnQgX3ksIGludCBfdSwgaW50IF92KQogICAgewogICAgICAgIHggPSBfeDsKICAgICAgICB5ID0gX3k7CiAgICAgICAgdSA9IF91OwogICAgICAgIHYgPSBfdjsKICAgIH0KfSByZWN0W05dLCBxdWVyaWVzW05dOwoKc3RydWN0IExpbmUKewogICAgaW50IHgsIGwsIHIsIGlkLCB0eXBlOwogICAgTGluZSgpe30KICAgIExpbmUoaW50IF94LCBpbnQgX2wsIGludCBfciwgaW50IF9pZCwgaW50IF90eXBlKQogICAgewogICAgICAgIHggPSBfeDsKICAgICAgICBsID0gX2w7CiAgICAgICAgciA9IF9yOwogICAgICAgIGlkID0gX2lkOwogICAgICAgIHR5cGUgPSBfdHlwZTsKICAgIH0KICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgTGluZSAmb3RoZXIpIHsgcmV0dXJuICgoeCA8IG90aGVyLngpfHwoKHggPT0gb3RoZXIueCkmJih0eXBlIDwgb3RoZXIudHlwZSkpKTt9Cn07Cgp2ZWM8aWk+IHBvaW50czsKdmVjPGludD4gdmFsOwp2ZWM8TGluZT4gc3dlZXBsaW5lOwp2b2lkIGluaXQoKQp7CiAgICBjaW4gPj4gbiA+PiBtOwogICAgKytuOwogICAgcmVjdFsxXSA9IFJlY3RhbmdsZSgtMWU5LCAtMWU5LCAxZTksIDFlOSk7CiAgICB2YWwucGIoLTFlOSk7CiAgICB2YWwucGIoMWU5KTsKICAgIGZvcihpbnQgaSA9IDI7IGkgPD0gbjsgaSsrKQogICAgewogICAgICAgIGNpbiA+PiByZWN0W2ldLnggPj4gcmVjdFtpXS55ID4+IHJlY3RbaV0udSA+PiByZWN0W2ldLnY7CiAgICAgICAgdmFsLnBiKHJlY3RbaV0ueSk7CiAgICAgICAgdmFsLnBiKHJlY3RbaV0udik7CiAgICB9CiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IG07IGkrKykKICAgIHsKICAgICAgICBjaW4gPj4gcXVlcmllc1tpXS54ID4+IHF1ZXJpZXNbaV0ueSA+PiBxdWVyaWVzW2ldLnUgPj4gcXVlcmllc1tpXS52OwogICAgICAgIHZhbC5wYihxdWVyaWVzW2ldLnkpOwogICAgICAgIHZhbC5wYihxdWVyaWVzW2ldLnYpOwogICAgfQp9CnZlYzx2ZWM8aW50Pj4gYWRqKE4pOwppbnQgZGVwdGhbTl0sIHBhcltOXVsyMF0sIHBhclBvaW50c1tOXTsKdm9pZCBkZnMoaW50IHUsIGludCBwKQp7CiAgICBmb3IoaW50IHYgOiBhZGpbdV0pCiAgICB7CiAgICAgICAgaWYodiA9PSBwKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBwYXJbdl1bMF0gPSB1OwogICAgICAgIGRlcHRoW3ZdID0gZGVwdGhbdV0gKyAxOwogICAgICAgIGRmcyh2LCB1KTsKICAgIH0KfQppbnQgbGNhKGludCB1LCBpbnQgdikKewogICAgaWYoZGVwdGhbdV0gPCBkZXB0aFt2XSkKICAgICAgICBzd2FwKHUsIHYpOwogICAgZm9yKGludCBpID0gMTk7IGkgPj0gMDsgaS0tKQogICAgICAgIGlmKGRlcHRoW3Bhclt1XVtpXV0gPj0gZGVwdGhbdl0pCiAgICAgICAgICAgIHUgPSBwYXJbdV1baV07CiAgICBpZih1ID09IHYpCiAgICAgICAgcmV0dXJuIHU7CiAgICBmb3IoaW50IGkgPSAxOTsgaSA+PSAwOyBpLS0pCiAgICAgICAgaWYocGFyW3VdW2ldICE9IHBhclt2XVtpXSkKICAgICAgICB7CiAgICAgICAgICAgIHUgPSBwYXJbdV1baV07CiAgICAgICAgICAgIHYgPSBwYXJbdl1baV07CiAgICAgICAgfQogICAgcmV0dXJuIHBhclt1XVswXTsKfQppbnQgZ2V0RGlzdChpbnQgdSwgaW50IHYpCnsKICAgIHJldHVybiBkZXB0aFt1XSArIGRlcHRoW3ZdIC0gMiAqIGRlcHRoW2xjYSh1LCB2KV07Cn0KaWkgcXVbTl07CmNsYXNzIFNlZ21lbnRUcmVlCnsKcHJpdmF0ZToKICAgIGludCBuOwogICAgdmVjPGludD4gc3QsIGx6OwogICAgdm9pZCBwdXNoRG93bihpbnQgaWQpCiAgICB7CiAgICAgICAgaWYobHpbaWRdID09IDApCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBzdFsyICogaWRdID0gbHpbaWRdOwogICAgICAgIHN0WzIgKiBpZCArIDFdID0gbHpbaWRdOwogICAgICAgIGx6WzIgKiBpZF0gPSBseltpZF07CiAgICAgICAgbHpbMiAqaWQgKyAxXSA9IGx6W2lkXTsKICAgICAgICBseltpZF0gPSAwOwogICAgfQogICAgdm9pZCB1cGRhdGUoaW50IHUsIGludCB2LCBpbnQgdmFsLCBpbnQgbCwgaW50IHIsIGludCBpZCkKICAgIHsKICAgICAgICBpZigodSA+IHYpfHwobCA+IHIpfHwobCA+IHYpfHwodSA+IHIpKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgaWYoKHUgPD0gbCkmJihyIDw9IHYpKQogICAgICAgIHsKICAgICAgICAgICAgc3RbaWRdID0gdmFsOwogICAgICAgICAgICBseltpZF0gPSB2YWw7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcHVzaERvd24oaWQpOwogICAgICAgIGludCBtaWQgPSAobCArIHIpID4+IDE7CiAgICAgICAgdXBkYXRlKHUsIHYsIHZhbCwgbCwgbWlkLCAyKmlkKTsKICAgICAgICB1cGRhdGUodSwgdiwgdmFsLCBtaWQgKyAxLCByLCAyKmlkICsgMSk7CiAgICAgICAgaWYoc3RbMiAqIGlkXSkKICAgICAgICAgICAgc3RbaWRdID0gc3RbMiAqIGlkXTsKICAgICAgICBpZihzdFsyKmlkICsgMV0pCiAgICAgICAgICAgIHN0W2lkXSA9IHN0WzIqaWQgKyAxXTsKICAgIH0KICAgIGludCBnZXRWYWwoaW50IHBvcywgaW50IGwsIGludCByLCBpbnQgaWQpCiAgICB7CiAgICAgICAgaWYoKGwgPiByKXx8KGwgPiBwb3MpfHwocG9zID4gcikpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIGlmKGwgPT0gcikKICAgICAgICAgICAgcmV0dXJuIHN0W2lkXTsKICAgICAgICBwdXNoRG93bihpZCk7CiAgICAgICAgaW50IG1pZCA9IChsICsgcikgPj4gMTsKICAgICAgICBpbnQgcmVzID0gMDsKICAgICAgICBpZihwb3MgPD0gbWlkKQogICAgICAgICAgICByZXMgPSBtYXgocmVzLCBnZXRWYWwocG9zLCBsLCBtaWQsIDIqaWQpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIHJlcyA9IG1heChyZXMsIGdldFZhbChwb3MsIG1pZCArIDEsIHIsIDIqaWQgKyAxKSk7CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KcHVibGljOgogICAgU2VnbWVudFRyZWUoaW50IF9uID0gMCkKICAgIHsKICAgICAgICB0aGlzLT5uID0gX247CiAgICAgICAgc3QgPSBseiA9IHZlYzxpbnQ+KDQgKiBuICsgNywgMCk7CiAgICB9CiAgICB2b2lkIHVwZGF0ZShpbnQgbCwgaW50IHIsIGludCB2YWwpIHsgcmV0dXJuIHVwZGF0ZShsLCByLCB2YWwsIDEsIG4sIDEpO30KICAgIGludCBnZXRWYWwoaW50IHBvcykgeyByZXR1cm4gZ2V0VmFsKHBvcywgMSwgbiwgMSk7fQp9IGl0Owp2b2lkIHByb2Nlc3MoY29uc3QgaW50ICZ0YykKewogICAgc29ydChTWih2YWwpKTsKICAgIHZhbC5lcmFzZSh1bmlxdWUoU1oodmFsKSksIHZhbC5lbmQoKSk7CiAgICBmb3IoaW50IGkgPSAxOyBpIDw9IG07IGkrKykKICAgIHsKICAgICAgICBxdWVyaWVzW2ldLnkgPSBsb3dlcl9ib3VuZChTWih2YWwpLCBxdWVyaWVzW2ldLnkpIC0gdmFsLmJlZ2luKCkgKyAxOwogICAgICAgIHF1ZXJpZXNbaV0udiA9IGxvd2VyX2JvdW5kKFNaKHZhbCksIHF1ZXJpZXNbaV0udikgLSB2YWwuYmVnaW4oKSArIDE7CiAgICAgICAgcG9pbnRzLnBiKGlpKHF1ZXJpZXNbaV0ueCwgcXVlcmllc1tpXS55KSk7CiAgICAgICAgcG9pbnRzLnBiKGlpKHF1ZXJpZXNbaV0udSwgcXVlcmllc1tpXS52KSk7CiAgICB9CiAgICBzb3J0KFNaKHBvaW50cykpOwogICAgcG9pbnRzLmVyYXNlKHVuaXF1ZShTWihwb2ludHMpKSwgcG9pbnRzLmVuZCgpKTsKICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKQogICAgewogICAgICAgIHJlY3RbaV0ueSA9IGxvd2VyX2JvdW5kKFNaKHZhbCksIHJlY3RbaV0ueSkgLSB2YWwuYmVnaW4oKSArIDE7CiAgICAgICAgcmVjdFtpXS52ID0gbG93ZXJfYm91bmQoU1oodmFsKSwgcmVjdFtpXS52KSAtIHZhbC5iZWdpbigpICsgMTsKICAgICAgICBzd2VlcGxpbmUucGIoTGluZShyZWN0W2ldLngsIHJlY3RbaV0ueSwgcmVjdFtpXS52LCBpLCAwKSk7CiAgICAgICAgc3dlZXBsaW5lLnBiKExpbmUocmVjdFtpXS51LCByZWN0W2ldLnksIHJlY3RbaV0udiwgaSwgMikpOwogICAgfQogICAgZm9yKGludCBpID0gMTsgaSA8PSBtOyBpKyspCiAgICB7CiAgICAgICAgaW50IGlkMSA9IGxvd2VyX2JvdW5kKFNaKHBvaW50cyksIGlpKHF1ZXJpZXNbaV0ueCwgcXVlcmllc1tpXS55KSkgLSBwb2ludHMuYmVnaW4oKSArIDE7CiAgICAgICAgaW50IGlkMiA9IGxvd2VyX2JvdW5kKFNaKHBvaW50cyksIGlpKHF1ZXJpZXNbaV0udSwgcXVlcmllc1tpXS52KSkgLSBwb2ludHMuYmVnaW4oKSArIDE7CiAgICAgICAgcXVbaV0gPSBpaShpZDEsIGlkMik7CiAgICB9CgogICAgZm9yKGludCBpID0gMTsgaSA8PSAoaW50KXBvaW50cy5zaXplKCk7IGkrKykKICAgICAgICBzd2VlcGxpbmUucGIoTGluZShwb2ludHNbaSAtIDFdLmZpLCBwb2ludHNbaSAtIDFdLnNlLCBwb2ludHNbaSAtIDFdLnNlLCBpLCAxKSk7CgoKCgogICAgc29ydChTWihzd2VlcGxpbmUpKTsKICAgIGl0ID0gU2VnbWVudFRyZWUoKGludCl2YWwuc2l6ZSgpKTsKICAgIGZvcihhdXRvICZ4IDogc3dlZXBsaW5lKSB7CiAgICAgICAgaWYoeC50eXBlID09IDIpCiAgICAgICAgewogICAgICAgICAgICBpdC51cGRhdGUoeC5sLCB4LnIsIHBhclt4LmlkXVswXSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGludCB1ID0gaXQuZ2V0VmFsKHgucik7CiAgICAgICAgICAgIGlmKHUgIT0gMCkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYoeC50eXBlID09IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcGFyW3guaWRdWzBdID0gdTsKICAgICAgICAgICAgICAgICAgICBhZGpbeC5pZF0ucGIodSk7CiAgICAgICAgICAgICAgICAgICAgYWRqW3VdLnBiKHguaWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIHBhclBvaW50c1t4LmlkXSA9IHU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoeC50eXBlID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGl0LnVwZGF0ZSh4LmwsIHguciwgeC5pZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBkZXB0aFswXSA9IC0xOwogICAgZGVwdGhbMV0gPSAwOwogICAgZGZzKDEsIC0xKTsKICAgIGZvcihpbnQgaSA9IDE7IGkgPCAyMDsgaSsrKQogICAgICAgIGZvcihpbnQgdSA9IDE7IHUgPD0gbiArIDE7IHUrKykKICAgICAgICAgICAgcGFyW3VdW2ldID0gcGFyW3Bhclt1XVtpIC0gMV1dW2kgLSAxXTsKICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gbTsgaSsrKQogICAgICAgIGNvdXQgPDwgZ2V0RGlzdChwYXJQb2ludHNbcXVbaV0uZmldLCBwYXJQb2ludHNbcXVbaV0uc2VdKSA8PCAnXG4nOwp9CmludCBtYWluKCkKewogICAgZmFzdGlvKCk7CiAgICBpbnQgdCA9IDE7CiAgICAvLyBjaW4gPj4gdDsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IHQ7IGkrKykKICAgIHsKICAgICAgICBpbml0KCk7CiAgICAgICAgcHJvY2VzcyhpKTsKICAgIH0KICAgIHJldHVybiAwOwp9Ci8qCiAgICBsIDw9IHUgJiYgdiA8PSByCiovCgo=