#include <bits/stdc++.h>
using namespace std;
/******** Fenwick: kth-alive ********/
struct BIT {
int n; vector<int> f;
BIT(int n=0){init(n);}
void init(int N){ n=N; f.assign(n+1,0); }
void add(int i,int v){ for(; i<=n; i+=i&-i) f[i]+=v; }
int kth(int k){ // smallest idx with pref >= k
int idx=0; int bit=1<<20; // enough for n <= 1e6
while(bit){
int nxt=idx+bit;
if(nxt<=n && f[nxt]<k){ idx=nxt; k-=f[nxt]; }
bit>>=1;
}
return idx+1;
}
};
/******** DSU ********/
struct DSU{
vector<int> p, sz;
DSU(int n=0){init(n);}
void init(int n){ p.resize(n+1); iota(p.begin(),p.end(),0); sz.assign(n+1,1); }
int find(int x){ return p[x]==x?x:p[x]=find(p[x]); }
int unite(int a,int b){
a=find(a); b=find(b);
if(a==b) return a;
if(sz[a]<sz[b]) swap(a,b);
p[b]=a; sz[a]+=sz[b]; return a;
}
};
/******** SegTree Max(h) ********/
struct SegMax{
int n; vector<long long> mx;
SegMax(int N=0){init(N);}
void init(int N){ n=1; while(n<N) n<<=1; mx.assign(2*n,LLONG_MIN/4); }
void build(const vector<long long>& a){
int N=(int)a.size()-1;
for(int i=1;i<=N;i++) mx[n+i-1]=a[i];
for(int i=n-1;i>=1;i--) mx[i]=max(mx[i<<1],mx[i<<1|1]);
}
long long getMax(int l,int r){
if(l>r) return LLONG_MIN/4;
l+=n-1; r+=n-1; long long res=LLONG_MIN/4;
while(l<=r){
if(l&1) res=max(res,mx[l++]);
if(!(r&1)) res=max(res,mx[r--]);
l>>=1; r>>=1;
}
return res;
}
// first t in [L..R] with max(L..t) >= H; if none -> R+1
int firstPrefixAtLeast(int L,int R,long long H){
if(getMax(L,R) < H) return R+1;
int lo=L, hi=R, ans=R+1;
while(lo<=hi){
int mid=(lo+hi)>>1;
if(getMax(L,mid) >= H){ ans=mid; hi=mid-1; }
else lo=mid+1;
}
return ans;
}
// last t in [L..R] with max(t..R) >= H; if none -> L-1
int lastSuffixAtLeast(int L,int R,long long H){
if(getMax(L,R) < H) return L-1;
int lo=L, hi=R, ans=L-1;
while(lo<=hi){
int mid=(lo+hi)>>1;
if(getMax(mid,R) >= H){ ans=mid; lo=mid+1; }
else hi=mid-1;
}
return ans;
}
};
/******** SegTree assign + sum (water level) ********/
struct SegAssignSum{
int n;
struct Node{ long long sum,tag; int len; };
vector<Node> st;
SegAssignSum(int N=0){init(N);}
void init(int N){
n=1; while(n<N) n<<=1;
st.assign(2*n,{0,LLONG_MIN/4,0});
for(int i=n;i<2*n;i++) st[i].len=1;
for(int i=n-1;i>=1;i--) st[i].len=st[i<<1].len+st[i<<1|1].len;
}
void build(const vector<long long>& a){
int N=(int)a.size()-1;
for(int i=1;i<=N;i++) st[n+i-1].sum=a[i];
for(int i=n-1;i>=1;i--) st[i].sum=st[i<<1].sum+st[i<<1|1].sum;
}
void apply(int p,long long v){ st[p].sum=v*st[p].len; st[p].tag=v; }
void push(int p){
if(st[p].tag>LLONG_MIN/8){
apply(p<<1,st[p].tag); apply(p<<1|1,st[p].tag); st[p].tag=LLONG_MIN/4;
}
}
void pull(int p){ st[p].sum=st[p<<1].sum+st[p<<1|1].sum; }
void assign(int p,int L,int R,int l,int r,long long v){
if(l>R||r<L) return;
if(l<=L && R<=r){ apply(p,v); return; }
push(p);
int M=(L+R)>>1;
assign(p<<1,L,M,l,r,v);
assign(p<<1|1,M+1,R,l,r,v);
pull(p);
}
void assign(int l,int r,long long v){ if(l<=r) assign(1,1,n,l,r,v); }
long long sum(int p,int L,int R,int l,int r){
if(l>R||r<L) return 0;
if(l<=L && R<=r) return st[p].sum;
push(p);
int M=(L+R)>>1;
return sum(p<<1,L,M,l,r)+sum(p<<1|1,M+1,R,l,r);
}
long long sum(int l,int r){ if(l>r) return 0; return sum(1,1,n,l,r); }
};
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
if(!(cin>>n)) return 0;
vector<long long> h(n+1);
for(int i=1;i<=n;i++) cin>>h[i];
vector<int> k(n);
for(int i=1;i<=n-1;i++) cin>>k[i];
// DSU meta
DSU dsu(n+5);
vector<int> L(n+5), R(n+5);
vector<long long> mx(n+5), cap(n+5,0);
vector<int> limL(n+5), limR(n+5); // processed suffix/prefix borders
for(int i=1;i<=n;i++){
dsu.p[i]=i; dsu.sz[i]=1;
L[i]=R[i]=i; mx[i]=h[i];
limL[i]=R[i]+1; // processed suffix from limL..R (empty)
limR[i]=L[i]-1; // processed prefix from L..limR (empty)
}
// segment trees
SegMax segH(n+2); segH.build(h);
SegAssignSum segW(n+2); segW.init(n+2); segW.build(h); // water level (start = heights)
auto mergeReps = [&](int a,int b)->int{
a=dsu.find(a); b=dsu.find(b);
long long H = min(mx[a], mx[b]);
long long extra = 0;
// Pour into left segment 'a' from the right up to where prefix_max >= H
int t0 = segH.firstPrefixAtLeast(L[a], R[a], H); // t0 in [L..R] or R+1
int l1 = max(t0, L[a]);
int r1 = min(limL[a]-1, R[a]);
if(l1 <= r1){
long long old = segW.sum(l1, r1);
segW.assign(l1, r1, H);
extra += H*1ll*(r1-l1+1) - old;
limL[a] = l1; // now processed down to l1
}
// Pour into right segment 'b' from the left up to where suffix_max >= H
int u0 = segH.lastSuffixAtLeast(L[b], R[b], H); // u0 in [L..R] or L-1
int l2 = max(L[b], limR[b]+1);
int r2 = min(u0, R[b]);
if(l2 <= r2){
long long old = segW.sum(l2, r2);
segW.assign(l2, r2, H);
extra += H*1ll*(r2-l2+1) - old;
limR[b] = r2; // now processed up to r2
}
int c = dsu.unite(a,b);
L[c]=L[a]; R[c]=R[b];
mx[c]=max(mx[a],mx[b]);
cap[c]=cap[a]+cap[b]+extra;
limL[c]=limL[a]; limR[c]=limR[b];
return c;
};
// maintain current order of segments with BIT + linked list
BIT bit(n);
vector<int> nxt(n+2), prv(n+2), alive(n+2,0), posRep(n+2);
bit.init(n);
for(int i=1;i<=n;i++){
alive[i]=1; bit.add(i,1);
nxt[i]=i+1; prv[i]=i-1;
posRep[i]=i;
}
nxt[0]=1; prv[n+1]=n;
auto rightNeighbor = [&](int i){ return nxt[i]; };
auto erasePos = [&](int i){
int Lft=prv[i], Rgt=nxt[i];
nxt[Lft]=Rgt; prv[Rgt]=Lft;
if(alive[i]){ alive[i]=0; bit.add(i,-1); }
};
for(int step=1; step<=n-1; ++step){
int kth = k[step];
int pos = bit.kth(kth); // vị trí của đoạn thứ k
int posR = rightNeighbor(pos); // đoạn k+1 (phải kề)
int u = posRep[pos];
int v = posRep[posR];
int nr = mergeReps(u, v);
cout << cap[dsu.find(nr)] << '\n';
posRep[pos] = dsu.find(nr);
erasePos(posR); // xóa đoạn k+1 khỏi trật tự
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovKioqKioqKiogRmVud2ljazoga3RoLWFsaXZlICoqKioqKioqLwpzdHJ1Y3QgQklUIHsKICAgIGludCBuOyB2ZWN0b3I8aW50PiBmOwogICAgQklUKGludCBuPTApe2luaXQobik7fQogICAgdm9pZCBpbml0KGludCBOKXsgbj1OOyBmLmFzc2lnbihuKzEsMCk7IH0KICAgIHZvaWQgYWRkKGludCBpLGludCB2KXsgZm9yKDsgaTw9bjsgaSs9aSYtaSkgZltpXSs9djsgfQogICAgaW50IGt0aChpbnQgayl7ICAgICAgICAgICAgICAgICAvLyBzbWFsbGVzdCBpZHggd2l0aCBwcmVmID49IGsKICAgICAgICBpbnQgaWR4PTA7IGludCBiaXQ9MTw8MjA7ICAgLy8gZW5vdWdoIGZvciBuIDw9IDFlNgogICAgICAgIHdoaWxlKGJpdCl7CiAgICAgICAgICAgIGludCBueHQ9aWR4K2JpdDsKICAgICAgICAgICAgaWYobnh0PD1uICYmIGZbbnh0XTxrKXsgaWR4PW54dDsgay09ZltueHRdOyB9CiAgICAgICAgICAgIGJpdD4+PTE7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpZHgrMTsKICAgIH0KfTsKCi8qKioqKioqKiBEU1UgKioqKioqKiovCnN0cnVjdCBEU1V7CiAgICB2ZWN0b3I8aW50PiBwLCBzejsKICAgIERTVShpbnQgbj0wKXtpbml0KG4pO30KICAgIHZvaWQgaW5pdChpbnQgbil7IHAucmVzaXplKG4rMSk7IGlvdGEocC5iZWdpbigpLHAuZW5kKCksMCk7IHN6LmFzc2lnbihuKzEsMSk7IH0KICAgIGludCBmaW5kKGludCB4KXsgcmV0dXJuIHBbeF09PXg/eDpwW3hdPWZpbmQocFt4XSk7IH0KICAgIGludCB1bml0ZShpbnQgYSxpbnQgYil7CiAgICAgICAgYT1maW5kKGEpOyBiPWZpbmQoYik7CiAgICAgICAgaWYoYT09YikgcmV0dXJuIGE7CiAgICAgICAgaWYoc3pbYV08c3pbYl0pIHN3YXAoYSxiKTsKICAgICAgICBwW2JdPWE7IHN6W2FdKz1zeltiXTsgcmV0dXJuIGE7CiAgICB9Cn07CgovKioqKioqKiogU2VnVHJlZSBNYXgoaCkgKioqKioqKiovCnN0cnVjdCBTZWdNYXh7CiAgICBpbnQgbjsgdmVjdG9yPGxvbmcgbG9uZz4gbXg7CiAgICBTZWdNYXgoaW50IE49MCl7aW5pdChOKTt9CiAgICB2b2lkIGluaXQoaW50IE4peyBuPTE7IHdoaWxlKG48Tikgbjw8PTE7IG14LmFzc2lnbigyKm4sTExPTkdfTUlOLzQpOyB9CiAgICB2b2lkIGJ1aWxkKGNvbnN0IHZlY3Rvcjxsb25nIGxvbmc+JiBhKXsKICAgICAgICBpbnQgTj0oaW50KWEuc2l6ZSgpLTE7CiAgICAgICAgZm9yKGludCBpPTE7aTw9TjtpKyspIG14W24raS0xXT1hW2ldOwogICAgICAgIGZvcihpbnQgaT1uLTE7aT49MTtpLS0pIG14W2ldPW1heChteFtpPDwxXSxteFtpPDwxfDFdKTsKICAgIH0KICAgIGxvbmcgbG9uZyBnZXRNYXgoaW50IGwsaW50IHIpewogICAgICAgIGlmKGw+cikgcmV0dXJuIExMT05HX01JTi80OwogICAgICAgIGwrPW4tMTsgcis9bi0xOyBsb25nIGxvbmcgcmVzPUxMT05HX01JTi80OwogICAgICAgIHdoaWxlKGw8PXIpewogICAgICAgICAgICBpZihsJjEpIHJlcz1tYXgocmVzLG14W2wrK10pOwogICAgICAgICAgICBpZighKHImMSkpIHJlcz1tYXgocmVzLG14W3ItLV0pOwogICAgICAgICAgICBsPj49MTsgcj4+PTE7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXM7CiAgICB9CiAgICAvLyBmaXJzdCB0IGluIFtMLi5SXSB3aXRoIG1heChMLi50KSA+PSBIOyBpZiBub25lIC0+IFIrMQogICAgaW50IGZpcnN0UHJlZml4QXRMZWFzdChpbnQgTCxpbnQgUixsb25nIGxvbmcgSCl7CiAgICAgICAgaWYoZ2V0TWF4KEwsUikgPCBIKSByZXR1cm4gUisxOwogICAgICAgIGludCBsbz1MLCBoaT1SLCBhbnM9UisxOwogICAgICAgIHdoaWxlKGxvPD1oaSl7CiAgICAgICAgICAgIGludCBtaWQ9KGxvK2hpKT4+MTsKICAgICAgICAgICAgaWYoZ2V0TWF4KEwsbWlkKSA+PSBIKXsgYW5zPW1pZDsgaGk9bWlkLTE7IH0KICAgICAgICAgICAgZWxzZSBsbz1taWQrMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFuczsKICAgIH0KICAgIC8vIGxhc3QgdCBpbiBbTC4uUl0gd2l0aCBtYXgodC4uUikgPj0gSDsgaWYgbm9uZSAtPiBMLTEKICAgIGludCBsYXN0U3VmZml4QXRMZWFzdChpbnQgTCxpbnQgUixsb25nIGxvbmcgSCl7CiAgICAgICAgaWYoZ2V0TWF4KEwsUikgPCBIKSByZXR1cm4gTC0xOwogICAgICAgIGludCBsbz1MLCBoaT1SLCBhbnM9TC0xOwogICAgICAgIHdoaWxlKGxvPD1oaSl7CiAgICAgICAgICAgIGludCBtaWQ9KGxvK2hpKT4+MTsKICAgICAgICAgICAgaWYoZ2V0TWF4KG1pZCxSKSA+PSBIKXsgYW5zPW1pZDsgbG89bWlkKzE7IH0KICAgICAgICAgICAgZWxzZSBoaT1taWQtMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFuczsKICAgIH0KfTsKCi8qKioqKioqKiBTZWdUcmVlIGFzc2lnbiArIHN1bSAod2F0ZXIgbGV2ZWwpICoqKioqKioqLwpzdHJ1Y3QgU2VnQXNzaWduU3VtewogICAgaW50IG47CiAgICBzdHJ1Y3QgTm9kZXsgbG9uZyBsb25nIHN1bSx0YWc7IGludCBsZW47IH07CiAgICB2ZWN0b3I8Tm9kZT4gc3Q7CiAgICBTZWdBc3NpZ25TdW0oaW50IE49MCl7aW5pdChOKTt9CiAgICB2b2lkIGluaXQoaW50IE4pewogICAgICAgIG49MTsgd2hpbGUobjxOKSBuPDw9MTsKICAgICAgICBzdC5hc3NpZ24oMipuLHswLExMT05HX01JTi80LDB9KTsKICAgICAgICBmb3IoaW50IGk9bjtpPDIqbjtpKyspIHN0W2ldLmxlbj0xOwogICAgICAgIGZvcihpbnQgaT1uLTE7aT49MTtpLS0pIHN0W2ldLmxlbj1zdFtpPDwxXS5sZW4rc3RbaTw8MXwxXS5sZW47CiAgICB9CiAgICB2b2lkIGJ1aWxkKGNvbnN0IHZlY3Rvcjxsb25nIGxvbmc+JiBhKXsKICAgICAgICBpbnQgTj0oaW50KWEuc2l6ZSgpLTE7CiAgICAgICAgZm9yKGludCBpPTE7aTw9TjtpKyspIHN0W24raS0xXS5zdW09YVtpXTsKICAgICAgICBmb3IoaW50IGk9bi0xO2k+PTE7aS0tKSBzdFtpXS5zdW09c3RbaTw8MV0uc3VtK3N0W2k8PDF8MV0uc3VtOwogICAgfQogICAgdm9pZCBhcHBseShpbnQgcCxsb25nIGxvbmcgdil7IHN0W3BdLnN1bT12KnN0W3BdLmxlbjsgc3RbcF0udGFnPXY7IH0KICAgIHZvaWQgcHVzaChpbnQgcCl7CiAgICAgICAgaWYoc3RbcF0udGFnPkxMT05HX01JTi84KXsKICAgICAgICAgICAgYXBwbHkocDw8MSxzdFtwXS50YWcpOyBhcHBseShwPDwxfDEsc3RbcF0udGFnKTsgc3RbcF0udGFnPUxMT05HX01JTi80OwogICAgICAgIH0KICAgIH0KICAgIHZvaWQgcHVsbChpbnQgcCl7IHN0W3BdLnN1bT1zdFtwPDwxXS5zdW0rc3RbcDw8MXwxXS5zdW07IH0KICAgIHZvaWQgYXNzaWduKGludCBwLGludCBMLGludCBSLGludCBsLGludCByLGxvbmcgbG9uZyB2KXsKICAgICAgICBpZihsPlJ8fHI8TCkgcmV0dXJuOwogICAgICAgIGlmKGw8PUwgJiYgUjw9cil7IGFwcGx5KHAsdik7IHJldHVybjsgfQogICAgICAgIHB1c2gocCk7CiAgICAgICAgaW50IE09KEwrUik+PjE7CiAgICAgICAgYXNzaWduKHA8PDEsTCxNLGwscix2KTsKICAgICAgICBhc3NpZ24ocDw8MXwxLE0rMSxSLGwscix2KTsKICAgICAgICBwdWxsKHApOwogICAgfQogICAgdm9pZCBhc3NpZ24oaW50IGwsaW50IHIsbG9uZyBsb25nIHYpeyBpZihsPD1yKSBhc3NpZ24oMSwxLG4sbCxyLHYpOyB9CiAgICBsb25nIGxvbmcgc3VtKGludCBwLGludCBMLGludCBSLGludCBsLGludCByKXsKICAgICAgICBpZihsPlJ8fHI8TCkgcmV0dXJuIDA7CiAgICAgICAgaWYobDw9TCAmJiBSPD1yKSByZXR1cm4gc3RbcF0uc3VtOwogICAgICAgIHB1c2gocCk7CiAgICAgICAgaW50IE09KEwrUik+PjE7CiAgICAgICAgcmV0dXJuIHN1bShwPDwxLEwsTSxsLHIpK3N1bShwPDwxfDEsTSsxLFIsbCxyKTsKICAgIH0KICAgIGxvbmcgbG9uZyBzdW0oaW50IGwsaW50IHIpeyBpZihsPnIpIHJldHVybiAwOyByZXR1cm4gc3VtKDEsMSxuLGwscik7IH0KfTsKCmludCBtYWluKCl7CiAgICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKG51bGxwdHIpOwoKICAgIGludCBuOyAKICAgIGlmKCEoY2luPj5uKSkgcmV0dXJuIDA7CiAgICB2ZWN0b3I8bG9uZyBsb25nPiBoKG4rMSk7CiAgICBmb3IoaW50IGk9MTtpPD1uO2krKykgY2luPj5oW2ldOwogICAgdmVjdG9yPGludD4gayhuKTsKICAgIGZvcihpbnQgaT0xO2k8PW4tMTtpKyspIGNpbj4+a1tpXTsKCiAgICAvLyBEU1UgbWV0YQogICAgRFNVIGRzdShuKzUpOwogICAgdmVjdG9yPGludD4gTChuKzUpLCBSKG4rNSk7CiAgICB2ZWN0b3I8bG9uZyBsb25nPiBteChuKzUpLCBjYXAobis1LDApOwogICAgdmVjdG9yPGludD4gbGltTChuKzUpLCBsaW1SKG4rNSk7IC8vIHByb2Nlc3NlZCBzdWZmaXgvcHJlZml4IGJvcmRlcnMKCiAgICBmb3IoaW50IGk9MTtpPD1uO2krKyl7CiAgICAgICAgZHN1LnBbaV09aTsgZHN1LnN6W2ldPTE7CiAgICAgICAgTFtpXT1SW2ldPWk7IG14W2ldPWhbaV07CiAgICAgICAgbGltTFtpXT1SW2ldKzE7IC8vIHByb2Nlc3NlZCBzdWZmaXggZnJvbSBsaW1MLi5SIChlbXB0eSkKICAgICAgICBsaW1SW2ldPUxbaV0tMTsgLy8gcHJvY2Vzc2VkIHByZWZpeCBmcm9tIEwuLmxpbVIgKGVtcHR5KQogICAgfQoKICAgIC8vIHNlZ21lbnQgdHJlZXMKICAgIFNlZ01heCBzZWdIKG4rMik7IHNlZ0guYnVpbGQoaCk7CiAgICBTZWdBc3NpZ25TdW0gc2VnVyhuKzIpOyBzZWdXLmluaXQobisyKTsgc2VnVy5idWlsZChoKTsgLy8gd2F0ZXIgbGV2ZWwgKHN0YXJ0ID0gaGVpZ2h0cykKCiAgICBhdXRvIG1lcmdlUmVwcyA9IFsmXShpbnQgYSxpbnQgYiktPmludHsKICAgICAgICBhPWRzdS5maW5kKGEpOyBiPWRzdS5maW5kKGIpOwogICAgICAgIGxvbmcgbG9uZyBIID0gbWluKG14W2FdLCBteFtiXSk7CiAgICAgICAgbG9uZyBsb25nIGV4dHJhID0gMDsKCiAgICAgICAgLy8gUG91ciBpbnRvIGxlZnQgc2VnbWVudCAnYScgZnJvbSB0aGUgcmlnaHQgdXAgdG8gd2hlcmUgcHJlZml4X21heCA+PSBICiAgICAgICAgaW50IHQwID0gc2VnSC5maXJzdFByZWZpeEF0TGVhc3QoTFthXSwgUlthXSwgSCk7ICAgLy8gdDAgaW4gW0wuLlJdIG9yIFIrMQogICAgICAgIGludCBsMSA9IG1heCh0MCwgTFthXSk7CiAgICAgICAgaW50IHIxID0gbWluKGxpbUxbYV0tMSwgUlthXSk7CiAgICAgICAgaWYobDEgPD0gcjEpewogICAgICAgICAgICBsb25nIGxvbmcgb2xkID0gc2VnVy5zdW0obDEsIHIxKTsKICAgICAgICAgICAgc2VnVy5hc3NpZ24obDEsIHIxLCBIKTsKICAgICAgICAgICAgZXh0cmEgKz0gSCoxbGwqKHIxLWwxKzEpIC0gb2xkOwogICAgICAgICAgICBsaW1MW2FdID0gbDE7ICAgICAgICAgICAgLy8gbm93IHByb2Nlc3NlZCBkb3duIHRvIGwxCiAgICAgICAgfQoKICAgICAgICAvLyBQb3VyIGludG8gcmlnaHQgc2VnbWVudCAnYicgZnJvbSB0aGUgbGVmdCB1cCB0byB3aGVyZSBzdWZmaXhfbWF4ID49IEgKICAgICAgICBpbnQgdTAgPSBzZWdILmxhc3RTdWZmaXhBdExlYXN0KExbYl0sIFJbYl0sIEgpOyAgICAvLyB1MCBpbiBbTC4uUl0gb3IgTC0xCiAgICAgICAgaW50IGwyID0gbWF4KExbYl0sIGxpbVJbYl0rMSk7CiAgICAgICAgaW50IHIyID0gbWluKHUwLCBSW2JdKTsKICAgICAgICBpZihsMiA8PSByMil7CiAgICAgICAgICAgIGxvbmcgbG9uZyBvbGQgPSBzZWdXLnN1bShsMiwgcjIpOwogICAgICAgICAgICBzZWdXLmFzc2lnbihsMiwgcjIsIEgpOwogICAgICAgICAgICBleHRyYSArPSBIKjFsbCoocjItbDIrMSkgLSBvbGQ7CiAgICAgICAgICAgIGxpbVJbYl0gPSByMjsgICAgICAgICAgICAvLyBub3cgcHJvY2Vzc2VkIHVwIHRvIHIyCiAgICAgICAgfQoKICAgICAgICBpbnQgYyA9IGRzdS51bml0ZShhLGIpOwogICAgICAgIExbY109TFthXTsgUltjXT1SW2JdOwogICAgICAgIG14W2NdPW1heChteFthXSxteFtiXSk7CiAgICAgICAgY2FwW2NdPWNhcFthXStjYXBbYl0rZXh0cmE7CiAgICAgICAgbGltTFtjXT1saW1MW2FdOyBsaW1SW2NdPWxpbVJbYl07CiAgICAgICAgcmV0dXJuIGM7CiAgICB9OwoKICAgIC8vIG1haW50YWluIGN1cnJlbnQgb3JkZXIgb2Ygc2VnbWVudHMgd2l0aCBCSVQgKyBsaW5rZWQgbGlzdAogICAgQklUIGJpdChuKTsKICAgIHZlY3RvcjxpbnQ+IG54dChuKzIpLCBwcnYobisyKSwgYWxpdmUobisyLDApLCBwb3NSZXAobisyKTsKICAgIGJpdC5pbml0KG4pOwogICAgZm9yKGludCBpPTE7aTw9bjtpKyspewogICAgICAgIGFsaXZlW2ldPTE7IGJpdC5hZGQoaSwxKTsKICAgICAgICBueHRbaV09aSsxOyBwcnZbaV09aS0xOwogICAgICAgIHBvc1JlcFtpXT1pOwogICAgfQogICAgbnh0WzBdPTE7IHBydltuKzFdPW47CgogICAgYXV0byByaWdodE5laWdoYm9yID0gWyZdKGludCBpKXsgcmV0dXJuIG54dFtpXTsgfTsKICAgIGF1dG8gZXJhc2VQb3MgPSBbJl0oaW50IGkpewogICAgICAgIGludCBMZnQ9cHJ2W2ldLCBSZ3Q9bnh0W2ldOwogICAgICAgIG54dFtMZnRdPVJndDsgcHJ2W1JndF09TGZ0OwogICAgICAgIGlmKGFsaXZlW2ldKXsgYWxpdmVbaV09MDsgYml0LmFkZChpLC0xKTsgfQogICAgfTsKCiAgICBmb3IoaW50IHN0ZXA9MTsgc3RlcDw9bi0xOyArK3N0ZXApewogICAgICAgIGludCBrdGggPSBrW3N0ZXBdOwogICAgICAgIGludCBwb3MgPSBiaXQua3RoKGt0aCk7ICAgICAgICAgIC8vIHbhu4sgdHLDrSBj4bunYSDEkW/huqFuIHRo4bupIGsKICAgICAgICBpbnQgcG9zUiA9IHJpZ2h0TmVpZ2hib3IocG9zKTsgICAvLyDEkW/huqFuIGsrMSAocGjhuqNpIGvhu4EpCiAgICAgICAgaW50IHUgPSBwb3NSZXBbcG9zXTsKICAgICAgICBpbnQgdiA9IHBvc1JlcFtwb3NSXTsKCiAgICAgICAgaW50IG5yID0gbWVyZ2VSZXBzKHUsIHYpOwogICAgICAgIGNvdXQgPDwgY2FwW2RzdS5maW5kKG5yKV0gPDwgJ1xuJzsKCiAgICAgICAgcG9zUmVwW3Bvc10gPSBkc3UuZmluZChucik7CiAgICAgICAgZXJhc2VQb3MocG9zUik7ICAgICAgICAgICAgICAgICAgLy8geMOzYSDEkW/huqFuIGsrMSBraOG7j2kgdHLhuq10IHThu7EKICAgIH0KICAgIHJldHVybiAwOwp9Cg==