//#pragma GCC optimize("Ofast,unroll-loops")
//#pragma GCC target("avx2,tune=native")
#include <bits/stdc++.h>
using namespace std;
#define file "o"
#define ff(i, a, b) for (auto i=(a); i<=(b); ++i)
#define ffr(i, b, a) for (auto i=(b); i>=(a); --i)
#define nl "\n"
#define ss " "
#define pb emplace_back
#define fi first
#define se second
#define sz(s) (int)s.size()
#define all(s) (s).begin(), (s).end()
#define ms(a,x) memset(a, x, sizeof (a))
#define cn continue
#define re exit(0)
typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
ll ran(ll l, ll r) { return uniform_int_distribution<ll>(l, r)(rng); }
inline void rf() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
if (fopen(file".inp","r")) {
freopen(file".inp","r",stdin);
freopen(file".out","w",stdout);
}
}
const int mod = 1e9+7;
struct Upd {
int xa, ya, xb, yb, t;
ll w;
};
int main() {
rf();
int K, P;
if(!(cin >> K >> P)) return 0;
vector<Upd> ups(P);
int maxT = 0;
// Tổng năng lượng S bằng hiệu 2D toàn cục
vector<vector<ll>> D(K+3, vector<ll>(K+3, 0));
ff(i,0,P-1){
int xa, ya, xb, yb, t; ll w;
cin >> xa >> ya >> xb >> yb >> t >> w;
if(xa>xb) swap(xa,xb);
if(ya>yb) swap(ya,yb);
ups[i] = {xa,ya,xb,yb,t,w};
maxT = max(maxT, t);
// Cập nhật tổng S (không phân biệt kênh)
D[xa][ya] += w;
D[xb+1][ya] -= w;
D[xa][yb+1] -= w;
D[xb+1][yb+1] += w;
}
// Prefix 2D -> S
vector<vector<ll>> S(K+2, vector<ll>(K+2,0));
ff(x,1,K){
ll run=0;
ff(y,1,K){
run += D[x][y];
S[x][y] = S[x-1][y] + run;
}
}
// Gom chỉ số update theo kênh để xác minh nhanh
vector<vector<int>> byT(maxT+1);
ff(i,0,P-1) byT[ups[i].t].push_back(i);
// Chia khối
const int B = 32; // 32~40 là ổn
int BX = (K + B - 1) / B, BY = (K + B - 1) / B;
struct BlockInfo {
int cand = 0; // ứng viên Boyer–Moore
ll bal = 0; // cân bằng
vector<int> border; // danh sách update cắt biên khối
};
vector<vector<BlockInfo>> blk(BX, vector<BlockInfo>(BY));
auto blockBounds = [&](int bx, int by) {
int xl = bx*B + 1, xr = min(K, (bx+1)*B);
int yl = by*B + 1, yr = min(K, (by+1)*B);
return array<int,4>{xl,yl,xr,yr};
};
auto fullyCover = [&](const Upd& u, int bx, int by)->bool{
auto b = blockBounds(bx,by);
return (u.xa <= b[0] && b[2] <= u.xb && u.ya <= b[1] && b[3] <= u.yb);
};
auto overlap = [&](const Upd& u, int bx, int by)->bool{
auto b = blockBounds(bx,by);
if (u.xa > b[2] || u.xb < b[0] || u.ya > b[3] || u.yb < b[1]) return false;
return true;
};
// Boyer–Moore theo khối + gom border
for(int i=0;i<P;++i){
const auto &u = ups[i];
int bx1 = (u.xa-1)/B, bx2 = (u.xb-1)/B;
int by1 = (u.ya-1)/B, by2 = (u.yb-1)/B;
for(int bx=bx1; bx<=bx2; ++bx){
for(int by=by1; by<=by2; ++by){
if(fullyCover(u,bx,by)){
auto &bi = blk[bx][by];
if(bi.cand==u.t){ bi.bal += u.w; }
else{
if(bi.bal >= u.w) bi.bal -= u.w;
else { bi.cand = u.t; bi.bal = u.w - bi.bal; }
}
}else if(overlap(u,bx,by)){
blk[bx][by].border.push_back(i);
}
}
}
}
// Kết quả
vector<vector<int>> ans(K+1, vector<int>(K+1, 0));
// Xác minh cho từng khối
for(int bx=0; bx<BX; ++bx){
for(int by=0; by<BY; ++by){
auto b = blockBounds(bx,by);
int xl=b[0], yl=b[1], xr=b[2], yr=b[3];
int nx = xr-xl+1, ny = yr-yl+1;
// Tập kênh cần kiểm tra
vector<int> candList;
{
unordered_set<int> seen;
if(blk[bx][by].cand) { seen.insert(blk[bx][by].cand); candList.push_back(blk[bx][by].cand); }
for(int id: blk[bx][by].border){
int t = ups[id].t;
if(!seen.count(t)){ seen.insert(t); candList.push_back(t); }
}
}
// Nếu không có ứng viên nào (rất hiếm) → chắc chắn 0
if(candList.empty()){
ff(x,xl,xr) ff(y,yl,yr) ans[x][y]=0;
continue;
}
// Với mỗi kênh ứng viên, tính năng lượng trong khối bằng hiệu 2D cục bộ và kiểm tra
// Nếu tìm được kênh thắng, gán ngay (không thể có 2 kênh > 1/2).
// Đầu tiên, mặc định là 0
ff(x,xl,xr) ff(y,yl,yr) ans[x][y]=0;
for(int t : candList){
// diff cục bộ
vector<vector<ll>> Dloc(nx+2, vector<ll>(ny+2, 0));
ll baseAll = 0;
// duyệt tất cả update của kênh t
for(int id : byT[t]){
const auto &u = ups[id];
if(u.xa>xr || u.xb<xl || u.ya>yr || u.yb<yl) continue; // không giao
if(u.xa<=xl && xr<=u.xb && u.ya<=yl && yr<=u.yb){
// phủ trọn khối
baseAll += u.w;
}else{
// giao cục bộ
int xa=max(u.xa,xl), xb=min(u.xb,xr);
int ya=max(u.ya,yl), yb=min(u.yb,yr);
// chuyển sang chỉ số 1..nx,1..ny
int x1=xa-xl+1, x2=xb-xl+1;
int y1=ya-yl+1, y2=yb-yl+1;
Dloc[x1][y1] += u.w;
Dloc[x2+1][y1] -= u.w;
Dloc[x1][y2+1] -= u.w;
Dloc[x2+1][y2+1] += u.w;
}
}
// Prefix cục bộ và kiểm tra điều kiện > 1/2
// Nếu ô nào đã có đáp án khác 0 thì bỏ qua (đã xác định kênh thắng)
for(int i=1;i<=nx;++i){
ll run=0;
for(int j=1;j<=ny;++j){
run += Dloc[i][j];
ll Ec = baseAll + ( (i>1?Dloc[i-1][j]:0) + run ); // Sai! cần prefix 2D chuẩn
}
}
// prefix 2D chuẩn:
for(int i=1;i<=nx;++i){
for(int j=1;j<=ny;++j){
Dloc[i][j] += Dloc[i-1][j] + Dloc[i][j-1] - Dloc[i-1][j-1];
}
}
bool anySet = false;
for(int i=1;i<=nx;++i){
for(int j=1;j<=ny;++j){
int x = xl + i - 1;
int y = yl + j - 1;
if(ans[x][y]) continue; // đã có kênh thắng
ll Ec = baseAll + Dloc[i][j];
if( Ec*2 > S[x][y] ){
ans[x][y] = t;
anySet = true;
}
}
}
// tối ưu nhỏ: nếu tất cả đã gán xong (không có ô nào còn 0 mà có thể được kênh khác thắng >1/2) thì có thể tiếp,
// nhưng để an toàn ta vẫn thử các ứng viên còn lại.
}
}
}
// In ra K dòng, mỗi dòng K số
ff(x,1,K){
ff(y,1,K){
if(y>1) cout << ' ';
cout << ans[x][y];
}
cout << '\n';
}
return 0;
}
Ly8jcHJhZ21hIEdDQyBvcHRpbWl6ZSgiT2Zhc3QsdW5yb2xsLWxvb3BzIikKLy8jcHJhZ21hIEdDQyB0YXJnZXQoImF2eDIsdHVuZT1uYXRpdmUiKQojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgZmlsZSAibyIKI2RlZmluZSBmZihpLCBhLCBiKSBmb3IgKGF1dG8gaT0oYSk7IGk8PShiKTsgKytpKQojZGVmaW5lIGZmcihpLCBiLCBhKSBmb3IgKGF1dG8gaT0oYik7IGk+PShhKTsgLS1pKQojZGVmaW5lIG5sICJcbiIKI2RlZmluZSBzcyAiICIKI2RlZmluZSBwYiBlbXBsYWNlX2JhY2sKI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIHN6KHMpIChpbnQpcy5zaXplKCkKI2RlZmluZSBhbGwocykgKHMpLmJlZ2luKCksIChzKS5lbmQoKQojZGVmaW5lIG1zKGEseCkgbWVtc2V0KGEsIHgsIHNpemVvZiAoYSkpCiNkZWZpbmUgY24gY29udGludWUKI2RlZmluZSByZSBleGl0KDApCgp0eXBlZGVmIGxvbmcgbG9uZyBsbDsKdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgdWxsOwp0eXBlZGVmIGxvbmcgZG91YmxlIGxkOwp0eXBlZGVmIHZlY3RvcjxpbnQ+IHZpOwp0eXBlZGVmIHZlY3RvcjxsbD4gdmxsOwp0eXBlZGVmIHBhaXI8aW50LGludD4gcGlpOwp0eXBlZGVmIHBhaXI8bGwsbGw+IHBsbDsKdHlwZWRlZiB2ZWN0b3I8cGlpPiB2cGlpOwp0eXBlZGVmIHZlY3RvcjxwbGw+IHZwbGw7CgptdDE5OTM3XzY0IHJuZyhjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkudGltZV9zaW5jZV9lcG9jaCgpLmNvdW50KCkpOwpsbCByYW4obGwgbCwgbGwgcikgeyByZXR1cm4gdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGxsPihsLCByKShybmcpOyB9CgppbmxpbmUgdm9pZCByZigpIHsKICAgIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwogICAgY2luLnRpZShudWxscHRyKTsgY291dC50aWUobnVsbHB0cik7CiAgICBpZiAoZm9wZW4oZmlsZSIuaW5wIiwiciIpKSB7CiAgICAgICAgZnJlb3BlbihmaWxlIi5pbnAiLCJyIixzdGRpbik7CiAgICAgICAgZnJlb3BlbihmaWxlIi5vdXQiLCJ3IixzdGRvdXQpOwogICAgfQp9Cgpjb25zdCBpbnQgbW9kID0gMWU5Kzc7CgpzdHJ1Y3QgVXBkIHsKICAgIGludCB4YSwgeWEsIHhiLCB5YiwgdDsKICAgIGxsIHc7Cn07CgppbnQgbWFpbigpIHsKICAgIHJmKCk7CgogICAgaW50IEssIFA7CiAgICBpZighKGNpbiA+PiBLID4+IFApKSByZXR1cm4gMDsKCiAgICB2ZWN0b3I8VXBkPiB1cHMoUCk7CiAgICBpbnQgbWF4VCA9IDA7CgogICAgLy8gVOG7lW5nIG7Eg25nIGzGsOG7o25nIFMgYuG6sW5nIGhp4buHdSAyRCB0b8OgbiBj4bulYwogICAgdmVjdG9yPHZlY3RvcjxsbD4+IEQoSyszLCB2ZWN0b3I8bGw+KEsrMywgMCkpOwoKICAgIGZmKGksMCxQLTEpewogICAgICAgIGludCB4YSwgeWEsIHhiLCB5YiwgdDsgbGwgdzsKICAgICAgICBjaW4gPj4geGEgPj4geWEgPj4geGIgPj4geWIgPj4gdCA+PiB3OwogICAgICAgIGlmKHhhPnhiKSBzd2FwKHhhLHhiKTsKICAgICAgICBpZih5YT55Yikgc3dhcCh5YSx5Yik7CiAgICAgICAgdXBzW2ldID0ge3hhLHlhLHhiLHliLHQsd307CiAgICAgICAgbWF4VCA9IG1heChtYXhULCB0KTsKCiAgICAgICAgLy8gQ+G6rXAgbmjhuq10IHThu5VuZyBTIChraMO0bmcgcGjDom4gYmnhu4d0IGvDqm5oKQogICAgICAgIERbeGFdW3lhXSAgICAgKz0gdzsKICAgICAgICBEW3hiKzFdW3lhXSAgIC09IHc7CiAgICAgICAgRFt4YV1beWIrMV0gICAtPSB3OwogICAgICAgIERbeGIrMV1beWIrMV0gKz0gdzsKICAgIH0KCiAgICAvLyBQcmVmaXggMkQgLT4gUwogICAgdmVjdG9yPHZlY3RvcjxsbD4+IFMoSysyLCB2ZWN0b3I8bGw+KEsrMiwwKSk7CiAgICBmZih4LDEsSyl7CiAgICAgICAgbGwgcnVuPTA7CiAgICAgICAgZmYoeSwxLEspewogICAgICAgICAgICBydW4gKz0gRFt4XVt5XTsKICAgICAgICAgICAgU1t4XVt5XSA9IFNbeC0xXVt5XSArIHJ1bjsKICAgICAgICB9CiAgICB9CgogICAgLy8gR29tIGNo4buJIHPhu5EgdXBkYXRlIHRoZW8ga8OqbmggxJHhu4MgeMOhYyBtaW5oIG5oYW5oCiAgICB2ZWN0b3I8dmVjdG9yPGludD4+IGJ5VChtYXhUKzEpOwogICAgZmYoaSwwLFAtMSkgYnlUW3Vwc1tpXS50XS5wdXNoX2JhY2soaSk7CgogICAgLy8gQ2hpYSBraOG7kWkKICAgIGNvbnN0IGludCBCID0gMzI7IC8vIDMyfjQwIGzDoCDhu5VuCiAgICBpbnQgQlggPSAoSyArIEIgLSAxKSAvIEIsIEJZID0gKEsgKyBCIC0gMSkgLyBCOwoKICAgIHN0cnVjdCBCbG9ja0luZm8gewogICAgICAgIGludCBjYW5kID0gMDsgICAvLyDhu6luZyB2acOqbiBCb3llcuKAk01vb3JlCiAgICAgICAgbGwgYmFsID0gMDsgICAgIC8vIGPDom4gYuG6sW5nCiAgICAgICAgdmVjdG9yPGludD4gYm9yZGVyOyAvLyBkYW5oIHPDoWNoIHVwZGF0ZSBj4bqvdCBiacOqbiBraOG7kWkKICAgIH07CiAgICB2ZWN0b3I8dmVjdG9yPEJsb2NrSW5mbz4+IGJsayhCWCwgdmVjdG9yPEJsb2NrSW5mbz4oQlkpKTsKCiAgICBhdXRvIGJsb2NrQm91bmRzID0gWyZdKGludCBieCwgaW50IGJ5KSB7CiAgICAgICAgaW50IHhsID0gYngqQiArIDEsIHhyID0gbWluKEssIChieCsxKSpCKTsKICAgICAgICBpbnQgeWwgPSBieSpCICsgMSwgeXIgPSBtaW4oSywgKGJ5KzEpKkIpOwogICAgICAgIHJldHVybiBhcnJheTxpbnQsND57eGwseWwseHIseXJ9OwogICAgfTsKCiAgICBhdXRvIGZ1bGx5Q292ZXIgPSBbJl0oY29uc3QgVXBkJiB1LCBpbnQgYngsIGludCBieSktPmJvb2x7CiAgICAgICAgYXV0byBiID0gYmxvY2tCb3VuZHMoYngsYnkpOwogICAgICAgIHJldHVybiAodS54YSA8PSBiWzBdICYmIGJbMl0gPD0gdS54YiAmJiB1LnlhIDw9IGJbMV0gJiYgYlszXSA8PSB1LnliKTsKICAgIH07CgogICAgYXV0byBvdmVybGFwID0gWyZdKGNvbnN0IFVwZCYgdSwgaW50IGJ4LCBpbnQgYnkpLT5ib29sewogICAgICAgIGF1dG8gYiA9IGJsb2NrQm91bmRzKGJ4LGJ5KTsKICAgICAgICBpZiAodS54YSA+IGJbMl0gfHwgdS54YiA8IGJbMF0gfHwgdS55YSA+IGJbM10gfHwgdS55YiA8IGJbMV0pIHJldHVybiBmYWxzZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CgogICAgLy8gQm95ZXLigJNNb29yZSB0aGVvIGto4buRaSArIGdvbSBib3JkZXIKICAgIGZvcihpbnQgaT0wO2k8UDsrK2kpewogICAgICAgIGNvbnN0IGF1dG8gJnUgPSB1cHNbaV07CiAgICAgICAgaW50IGJ4MSA9ICh1LnhhLTEpL0IsIGJ4MiA9ICh1LnhiLTEpL0I7CiAgICAgICAgaW50IGJ5MSA9ICh1LnlhLTEpL0IsIGJ5MiA9ICh1LnliLTEpL0I7CgogICAgICAgIGZvcihpbnQgYng9YngxOyBieDw9YngyOyArK2J4KXsKICAgICAgICAgICAgZm9yKGludCBieT1ieTE7IGJ5PD1ieTI7ICsrYnkpewogICAgICAgICAgICAgICAgaWYoZnVsbHlDb3Zlcih1LGJ4LGJ5KSl7CiAgICAgICAgICAgICAgICAgICAgYXV0byAmYmkgPSBibGtbYnhdW2J5XTsKICAgICAgICAgICAgICAgICAgICBpZihiaS5jYW5kPT11LnQpeyBiaS5iYWwgKz0gdS53OyB9CiAgICAgICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoYmkuYmFsID49IHUudykgYmkuYmFsIC09IHUudzsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7IGJpLmNhbmQgPSB1LnQ7IGJpLmJhbCA9IHUudyAtIGJpLmJhbDsgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH1lbHNlIGlmKG92ZXJsYXAodSxieCxieSkpewogICAgICAgICAgICAgICAgICAgIGJsa1tieF1bYnldLmJvcmRlci5wdXNoX2JhY2soaSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy8gS+G6v3QgcXXhuqMKICAgIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gYW5zKEsrMSwgdmVjdG9yPGludD4oSysxLCAwKSk7CgogICAgLy8gWMOhYyBtaW5oIGNobyB04burbmcga2jhu5FpCiAgICBmb3IoaW50IGJ4PTA7IGJ4PEJYOyArK2J4KXsKICAgICAgICBmb3IoaW50IGJ5PTA7IGJ5PEJZOyArK2J5KXsKICAgICAgICAgICAgYXV0byBiID0gYmxvY2tCb3VuZHMoYngsYnkpOwogICAgICAgICAgICBpbnQgeGw9YlswXSwgeWw9YlsxXSwgeHI9YlsyXSwgeXI9YlszXTsKICAgICAgICAgICAgaW50IG54ID0geHIteGwrMSwgbnkgPSB5ci15bCsxOwoKICAgICAgICAgICAgLy8gVOG6rXAga8OqbmggY+G6p24ga2nhu4NtIHRyYQogICAgICAgICAgICB2ZWN0b3I8aW50PiBjYW5kTGlzdDsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgdW5vcmRlcmVkX3NldDxpbnQ+IHNlZW47CiAgICAgICAgICAgICAgICBpZihibGtbYnhdW2J5XS5jYW5kKSB7IHNlZW4uaW5zZXJ0KGJsa1tieF1bYnldLmNhbmQpOyBjYW5kTGlzdC5wdXNoX2JhY2soYmxrW2J4XVtieV0uY2FuZCk7IH0KICAgICAgICAgICAgICAgIGZvcihpbnQgaWQ6IGJsa1tieF1bYnldLmJvcmRlcil7CiAgICAgICAgICAgICAgICAgICAgaW50IHQgPSB1cHNbaWRdLnQ7CiAgICAgICAgICAgICAgICAgICAgaWYoIXNlZW4uY291bnQodCkpeyBzZWVuLmluc2VydCh0KTsgY2FuZExpc3QucHVzaF9iYWNrKHQpOyB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIE7hur91IGtow7RuZyBjw7Mg4bupbmcgdmnDqm4gbsOgbyAocuG6pXQgaGnhur9tKSDihpIgY2jhuq9jIGNo4bqvbiAwCiAgICAgICAgICAgIGlmKGNhbmRMaXN0LmVtcHR5KCkpewogICAgICAgICAgICAgICAgZmYoeCx4bCx4cikgZmYoeSx5bCx5cikgYW5zW3hdW3ldPTA7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy8gVuG7m2kgbeG7l2kga8Oqbmgg4bupbmcgdmnDqm4sIHTDrW5oIG7Eg25nIGzGsOG7o25nIHRyb25nIGto4buRaSBi4bqxbmcgaGnhu4d1IDJEIGPhu6VjIGLhu5kgdsOgIGtp4buDbSB0cmEKICAgICAgICAgICAgLy8gTuG6v3UgdMOsbSDEkcaw4bujYyBrw6puaCB0aOG6r25nLCBnw6FuIG5nYXkgKGtow7RuZyB0aOG7gyBjw7MgMiBrw6puaCA+IDEvMikuCiAgICAgICAgICAgIC8vIMSQ4bqndSB0acOqbiwgbeG6t2MgxJHhu4tuaCBsw6AgMAogICAgICAgICAgICBmZih4LHhsLHhyKSBmZih5LHlsLHlyKSBhbnNbeF1beV09MDsKCiAgICAgICAgICAgIGZvcihpbnQgdCA6IGNhbmRMaXN0KXsKICAgICAgICAgICAgICAgIC8vIGRpZmYgY+G7pWMgYuG7mQogICAgICAgICAgICAgICAgdmVjdG9yPHZlY3RvcjxsbD4+IERsb2MobngrMiwgdmVjdG9yPGxsPihueSsyLCAwKSk7CiAgICAgICAgICAgICAgICBsbCBiYXNlQWxsID0gMDsKCiAgICAgICAgICAgICAgICAvLyBkdXnhu4d0IHThuqV0IGPhuqMgdXBkYXRlIGPhu6dhIGvDqm5oIHQKICAgICAgICAgICAgICAgIGZvcihpbnQgaWQgOiBieVRbdF0pewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gJnUgPSB1cHNbaWRdOwogICAgICAgICAgICAgICAgICAgIGlmKHUueGE+eHIgfHwgdS54Yjx4bCB8fCB1LnlhPnlyIHx8IHUueWI8eWwpIGNvbnRpbnVlOyAvLyBraMO0bmcgZ2lhbwoKICAgICAgICAgICAgICAgICAgICBpZih1LnhhPD14bCAmJiB4cjw9dS54YiAmJiB1LnlhPD15bCAmJiB5cjw9dS55Yil7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBo4bunIHRy4buNbiBraOG7kWkKICAgICAgICAgICAgICAgICAgICAgICAgYmFzZUFsbCArPSB1Lnc7CiAgICAgICAgICAgICAgICAgICAgfWVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdpYW8gY+G7pWMgYuG7mQogICAgICAgICAgICAgICAgICAgICAgICBpbnQgeGE9bWF4KHUueGEseGwpLCB4Yj1taW4odS54Yix4cik7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCB5YT1tYXgodS55YSx5bCksIHliPW1pbih1LnliLHlyKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2h1eeG7g24gc2FuZyBjaOG7iSBz4buRIDEuLm54LDEuLm55CiAgICAgICAgICAgICAgICAgICAgICAgIGludCB4MT14YS14bCsxLCB4Mj14Yi14bCsxOwogICAgICAgICAgICAgICAgICAgICAgICBpbnQgeTE9eWEteWwrMSwgeTI9eWIteWwrMTsKICAgICAgICAgICAgICAgICAgICAgICAgRGxvY1t4MV1beTFdICAgICAgICs9IHUudzsKICAgICAgICAgICAgICAgICAgICAgICAgRGxvY1t4MisxXVt5MV0gICAgIC09IHUudzsKICAgICAgICAgICAgICAgICAgICAgICAgRGxvY1t4MV1beTIrMV0gICAgIC09IHUudzsKICAgICAgICAgICAgICAgICAgICAgICAgRGxvY1t4MisxXVt5MisxXSAgICs9IHUudzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy8gUHJlZml4IGPhu6VjIGLhu5kgdsOgIGtp4buDbSB0cmEgxJFp4buBdSBraeG7h24gPiAxLzIKICAgICAgICAgICAgICAgIC8vIE7hur91IMO0IG7DoG8gxJHDoyBjw7MgxJHDoXAgw6FuIGtow6FjIDAgdGjDrCBi4buPIHF1YSAoxJHDoyB4w6FjIMSR4buLbmgga8OqbmggdGjhuq9uZykKICAgICAgICAgICAgICAgIGZvcihpbnQgaT0xO2k8PW54OysraSl7CiAgICAgICAgICAgICAgICAgICAgbGwgcnVuPTA7CiAgICAgICAgICAgICAgICAgICAgZm9yKGludCBqPTE7ajw9bnk7KytqKXsKICAgICAgICAgICAgICAgICAgICAgICAgcnVuICs9IERsb2NbaV1bal07CiAgICAgICAgICAgICAgICAgICAgICAgIGxsIEVjID0gYmFzZUFsbCArICggKGk+MT9EbG9jW2ktMV1bal06MCkgKyBydW4gKTsgLy8gU2FpISBj4bqnbiBwcmVmaXggMkQgY2h14bqpbgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIHByZWZpeCAyRCBjaHXhuqluOgogICAgICAgICAgICAgICAgZm9yKGludCBpPTE7aTw9bng7KytpKXsKICAgICAgICAgICAgICAgICAgICBmb3IoaW50IGo9MTtqPD1ueTsrK2opewogICAgICAgICAgICAgICAgICAgICAgICBEbG9jW2ldW2pdICs9IERsb2NbaS0xXVtqXSArIERsb2NbaV1bai0xXSAtIERsb2NbaS0xXVtqLTFdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJvb2wgYW55U2V0ID0gZmFsc2U7CiAgICAgICAgICAgICAgICBmb3IoaW50IGk9MTtpPD1ueDsrK2kpewogICAgICAgICAgICAgICAgICAgIGZvcihpbnQgaj0xO2o8PW55Oysrail7CiAgICAgICAgICAgICAgICAgICAgICAgIGludCB4ID0geGwgKyBpIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgaW50IHkgPSB5bCArIGogLSAxOwogICAgICAgICAgICAgICAgICAgICAgICBpZihhbnNbeF1beV0pIGNvbnRpbnVlOyAvLyDEkcOjIGPDsyBrw6puaCB0aOG6r25nCiAgICAgICAgICAgICAgICAgICAgICAgIGxsIEVjID0gYmFzZUFsbCArIERsb2NbaV1bal07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBFYyoyID4gU1t4XVt5XSApewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5zW3hdW3ldID0gdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFueVNldCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyB04buRaSDGsHUgbmjhu486IG7hur91IHThuqV0IGPhuqMgxJHDoyBnw6FuIHhvbmcgKGtow7RuZyBjw7Mgw7QgbsOgbyBjw7JuIDAgbcOgIGPDsyB0aOG7gyDEkcaw4bujYyBrw6puaCBraMOhYyB0aOG6r25nID4xLzIpIHRow6wgY8OzIHRo4buDIHRp4bq/cCwKICAgICAgICAgICAgICAgIC8vIG5oxrBuZyDEkeG7gyBhbiB0b8OgbiB0YSB24bqrbiB0aOG7rSBjw6FjIOG7qW5nIHZpw6puIGPDsm4gbOG6oWkuCiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy8gSW4gcmEgSyBkw7JuZywgbeG7l2kgZMOybmcgSyBz4buRCiAgICBmZih4LDEsSyl7CiAgICAgICAgZmYoeSwxLEspewogICAgICAgICAgICBpZih5PjEpIGNvdXQgPDwgJyAnOwogICAgICAgICAgICBjb3V0IDw8IGFuc1t4XVt5XTsKICAgICAgICB9CiAgICAgICAgY291dCA8PCAnXG4nOwogICAgfQogICAgcmV0dXJuIDA7Cn0K