// 14th CPU Problem A
#include <bits/stdc++.h>
using namespace std;
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define pb push_back
#define ff first
#define ss second
#define ok cerr<<"Line "<<__LINE__<<" : "<<"ok"<<endl
#define DBG(a) cerr<< "Line "<<__LINE__ <<" : "<< #a <<" = "<<(a)<<endl
#define fastio {ios_base::sync_with_stdio(false);cin.tie(NULL);}
#define Gene template< class
#define Rics printer& operator,
Gene c> struct rge{c b, e;};
Gene c> rge<c> range(c i, c j){ return {i, j};}
struct printer{
~printer(){cerr<<endl;}
Gene c >Rics(c x){ cerr<<boolalpha<<x; return *this;}
Rics(string x){cerr<<x;return *this;}
Gene c, class d >Rics(pair<c, d> x){ return *this,"(",x.first,", ",x.second,")";}
Gene ... d, Gene ...> class c >Rics(c<d...> x){ return *this, range(begin(x), end(x));}
Gene c >Rics(rge<c> x){
*this,"["; for(auto it = x.b; it != x.e; ++it)
*this,(it==x.b?"":", "),*it; return *this,"]";}
};
#define debug() cerr<<"LINE "<<__LINE__<<" >> ", printer()
#define dbg(x) "[",#x,": ",(x),"] "
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int my_rand(int l, int r) {
return uniform_int_distribution<int>(l, r) (rng);
}
typedef long long ll;
typedef pair<int,int> pii;
const int N = 200009;
vector< array<int,3> > operation;
// 0-> value, 1->active, 2->label
vector<array<int,3>> finalAr; // 1 based index,dummy insert at first
struct Node {
int value,active,label;
Node* left;
Node* right;
};
map<int,Node*> nodeMap;
map<int,int> labelToIdx;
Node* head = nullptr;
Node* tail = nullptr;
void append(int val, int label) {
Node* newNode = new Node();
newNode->value = val;
newNode->active = 1;
newNode-> label = label;
newNode->left = nullptr;
newNode->right = nullptr;
nodeMap[val] = newNode;
if (head == nullptr) {
head = tail = newNode;
} else {
tail->right = newNode;
newNode->left = tail;
tail = newNode;
}
}
void insertAfter(int newVal,int existingVal, int label) {
Node* existingNode = nodeMap[existingVal];
Node* newNode = new Node();
newNode -> value = newVal;
newNode->active = 1;
newNode-> label = label;
newNode -> left = existingNode;
newNode -> right = existingNode -> right;
// Update Links
if (existingNode -> right != nullptr) {
existingNode -> right -> left = newNode;
} else {
tail = newNode;
}
existingNode->right = newNode;
nodeMap[newVal] = newNode;
}
void insertBefore(int newVal,int existingVal, int label) {
Node* existingNode = nodeMap[existingVal];
Node* newNode = new Node();
newNode->value = newVal;
newNode->active = 1;
newNode->label = label;
newNode->right = existingNode;
newNode->left = existingNode->left;
if (existingNode->left != nullptr) {
existingNode->left->right = newNode;
} else {
head = newNode;
}
existingNode->left = newNode;
nodeMap[newVal] = newNode;
}
void remove(int val) {
Node* target = nodeMap[val];
target -> active = 0;
// if (target->left != nullptr) {
// target->left->right = target->right;
// } else {
// head = target->right;
// }
// if (target->right != nullptr) {
// target->right->left = target->left;
// } else {
// tail = target->left;
// }
// Remove from map and free memory
nodeMap.erase(val);
// delete target;
}
void buildFinalArray() {
finalAr.clear();
// 1 base index, push a dummy value;
finalAr.push_back({-1,-1,-1});
Node* cur = head;
int idx = 1;
while (cur != nullptr) {
// cout << curr->value;
finalAr.push_back({cur->value,cur->active,cur->label});
labelToIdx[cur->label] = idx++;
cur = cur->right;
}
// for(int i = 0; i < (int)finalAr.size(); i++){
// cout << "( " << finalAr[i][0] << " " << finalAr[i][1] << " ";
// cout << finalAr[i][2] << ") ";
// }
// cout << endl;
}
// ====== Segment Tree Portion ======
// idx 0 : sum, idx 1: count
ll treeInfo[N*4][2];
void build(int n,int b,int e) {
if (b == e) {
treeInfo[n][0] = treeInfo[n][1] = 0;
if (finalAr[b][1] == 1) {
treeInfo[n][0] = finalAr[b][0];
treeInfo[n][1] =1;
}
return;
}
int mid = (b + e) >> 1, l = n << 1, r = l | 1;
build(l, b, mid);
build(r, mid + 1, e);
//merge
treeInfo[n][0] = treeInfo[l][0] + treeInfo[r][0];
treeInfo[n][1] = treeInfo[l][1] + treeInfo[r][1];
}
void update(int n,int b,int e, int idx, int value)
{
if (b > idx || e < idx) return;
if (b == e && b == idx) {
treeInfo[n][0] = value;
if (value > 0) {
treeInfo[n][1] = 1;
}
else treeInfo[n][1] = 0;
return;
}
int mid = (b + e) >> 1, l = n << 1, r = l | 1;
update(l,b,mid,idx,value);
update(r,mid+1,e,idx,value);
//merge
treeInfo[n][0] = treeInfo[l][0] + treeInfo[r][0];
treeInfo[n][1] = treeInfo[l][1] + treeInfo[r][1];
}
// return sum of first m element
ll query(int n,int b,int e, int m)
{
if (treeInfo[n][1] == m) return treeInfo[n][0];
int mid = (b + e) >> 1, l = n << 1, r = l | 1;
if (treeInfo[l][1] > m) {
return query(l,b,mid,m);
} else {
return treeInfo[l][0] + query(r,mid+1,e, m - treeInfo[l][1]);
}
}
int main()
{
// fastio;
int q,first;
cin >> q >> first;
append(first,0);
map<int,int> labelLook;
labelLook[first] = 0;
operation.push_back({-1,first,-1});
for(int i = 1; i <= q; i++){
int typ = 0, l = -1, r = -1;
cin >> typ;
if (typ == 3) {
cin >> l;
remove(l);
operation.push_back({typ,l,labelLook[l]});
labelLook.erase(l);
}
else {
cin >> l >> r;
if (typ == 1) {
insertBefore(l,r,i);
labelLook[l] = i;
}
else if(typ == 2) {
insertAfter(l,r,i);
labelLook[l] = i;
}
operation.push_back({typ,l,r});
}
}
buildFinalArray();
// build update query
int n = finalAr.size() - 1;
build(1,1,n);
vector<ll> output;
for(int i = operation.size()-1; i >= 1; i--) {
int typ = operation[i][0];
int l = operation[i][1];
int r = operation[i][2];
if (typ == 1 || typ == 2) {
int idx = labelToIdx[i];
update(1,1,n,idx,0);
}
else if (typ == 3) {
int idx = labelToIdx[r]; // r is the label of removing numbr
update(1,1,n,idx,l); // l is the value of removed number, as we iterate reverse. add the number
}
else if (typ == 4) {
ll ans = query(1,1,n,r) - query(1,1,n,l-1);
output.push_back(ans);
}
}
for(int i = output.size()-1; i >= 0; i--){
cout << output[i] << "\n";
}
return 0;
}
Ly8gMTR0aCBDUFUgUHJvYmxlbSBBCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwogCiNkZWZpbmUgYWxsKHYpIHYuYmVnaW4oKSx2LmVuZCgpCiNkZWZpbmUgcmFsbCh2KSB2LnJiZWdpbigpLHYucmVuZCgpCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgZmYgZmlyc3QKI2RlZmluZSBzcyBzZWNvbmQKI2RlZmluZSBvayBjZXJyPDwiTGluZSAiPDxfX0xJTkVfXzw8IiA6ICI8PCJvayI8PGVuZGwKI2RlZmluZSBEQkcoYSkgY2Vycjw8ICJMaW5lICI8PF9fTElORV9fIDw8IiA6ICI8PCAjYSA8PCIgPSAiPDwoYSk8PGVuZGwKI2RlZmluZSBmYXN0aW8ge2lvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpO2Npbi50aWUoTlVMTCk7fQoKCiNkZWZpbmUgR2VuZSB0ZW1wbGF0ZTwgY2xhc3MKI2RlZmluZSBSaWNzIHByaW50ZXImIG9wZXJhdG9yLApHZW5lIGM+IHN0cnVjdCByZ2V7YyBiLCBlO307CkdlbmUgYz4gcmdlPGM+IHJhbmdlKGMgaSwgYyBqKXsgcmV0dXJuIHtpLCBqfTt9CnN0cnVjdCBwcmludGVyewogfnByaW50ZXIoKXtjZXJyPDxlbmRsO30KIEdlbmUgYyA+UmljcyhjIHgpeyBjZXJyPDxib29sYWxwaGE8PHg7IHJldHVybiAqdGhpczt9CiBSaWNzKHN0cmluZyB4KXtjZXJyPDx4O3JldHVybiAqdGhpczt9CiBHZW5lIGMsIGNsYXNzIGQgPlJpY3MocGFpcjxjLCBkPiB4KXsgcmV0dXJuICp0aGlzLCIoIix4LmZpcnN0LCIsICIseC5zZWNvbmQsIikiO30KIEdlbmUgLi4uIGQsIEdlbmUgLi4uPiBjbGFzcyBjID5SaWNzKGM8ZC4uLj4geCl7IHJldHVybiAqdGhpcywgcmFuZ2UoYmVnaW4oeCksIGVuZCh4KSk7fQogR2VuZSBjID5SaWNzKHJnZTxjPiB4KXsKICAgICAqdGhpcywiWyI7IGZvcihhdXRvIGl0ID0geC5iOyBpdCAhPSB4LmU7ICsraXQpCiAgICAgICAgICp0aGlzLChpdD09eC5iPyIiOiIsICIpLCppdDsgcmV0dXJuICp0aGlzLCJdIjt9Cn07CiNkZWZpbmUgZGVidWcoKSBjZXJyPDwiTElORSAiPDxfX0xJTkVfXzw8IiA+PiAiLCBwcmludGVyKCkKI2RlZmluZSBkYmcoeCkgIlsiLCN4LCI6ICIsKHgpLCJdICIKbXQxOTkzNyBybmcoY2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKTsKaW50IG15X3JhbmQoaW50IGwsIGludCByKSB7CiByZXR1cm4gdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludD4obCwgcikgKHJuZyk7Cn0KCiAKdHlwZWRlZiBsb25nIGxvbmcgbGw7CnR5cGVkZWYgcGFpcjxpbnQsaW50PiBwaWk7CiAKCgpjb25zdCBpbnQgTiA9IDIwMDAwOTsKdmVjdG9yPCBhcnJheTxpbnQsMz4gPiBvcGVyYXRpb247Ci8vIDAtPiB2YWx1ZSwgMS0+YWN0aXZlLCAyLT5sYWJlbAp2ZWN0b3I8YXJyYXk8aW50LDM+PiBmaW5hbEFyOyAvLyAxIGJhc2VkIGluZGV4LGR1bW15IGluc2VydCBhdCBmaXJzdAoKc3RydWN0IE5vZGUgewogIGludCB2YWx1ZSxhY3RpdmUsbGFiZWw7CiAgTm9kZSogbGVmdDsKICBOb2RlKiByaWdodDsKfTsKCm1hcDxpbnQsTm9kZSo+IG5vZGVNYXA7Cm1hcDxpbnQsaW50PiBsYWJlbFRvSWR4OwoKTm9kZSogaGVhZCA9IG51bGxwdHI7Ck5vZGUqIHRhaWwgPSBudWxscHRyOwoKdm9pZCBhcHBlbmQoaW50IHZhbCwgaW50IGxhYmVsKSB7CiAgICAKICAgIE5vZGUqIG5ld05vZGUgPSBuZXcgTm9kZSgpOwogICAgbmV3Tm9kZS0+dmFsdWUgPSB2YWw7CiAgICBuZXdOb2RlLT5hY3RpdmUgPSAxOwogICAgbmV3Tm9kZS0+IGxhYmVsID0gbGFiZWw7CiAgICBuZXdOb2RlLT5sZWZ0ID0gbnVsbHB0cjsKICAgIG5ld05vZGUtPnJpZ2h0ID0gbnVsbHB0cjsKICAgIAogICAgbm9kZU1hcFt2YWxdID0gbmV3Tm9kZTsKICAgIAogICAgaWYgKGhlYWQgPT0gbnVsbHB0cikgewogICAgICAgIGhlYWQgPSB0YWlsID0gbmV3Tm9kZTsKICAgIH0gZWxzZSB7CiAgICAgICAgdGFpbC0+cmlnaHQgPSBuZXdOb2RlOwogICAgICAgIG5ld05vZGUtPmxlZnQgPSB0YWlsOwogICAgICAgIHRhaWwgPSBuZXdOb2RlOwogICAgfQp9Cgp2b2lkIGluc2VydEFmdGVyKGludCBuZXdWYWwsaW50IGV4aXN0aW5nVmFsLCBpbnQgbGFiZWwpIHsKICBOb2RlKiBleGlzdGluZ05vZGUgPSBub2RlTWFwW2V4aXN0aW5nVmFsXTsKCiAgTm9kZSogbmV3Tm9kZSA9IG5ldyBOb2RlKCk7CiAgbmV3Tm9kZSAtPiB2YWx1ZSA9IG5ld1ZhbDsKICBuZXdOb2RlLT5hY3RpdmUgPSAxOwogIG5ld05vZGUtPiBsYWJlbCA9IGxhYmVsOwogIG5ld05vZGUgLT4gbGVmdCA9IGV4aXN0aW5nTm9kZTsKICBuZXdOb2RlIC0+IHJpZ2h0ID0gZXhpc3RpbmdOb2RlIC0+IHJpZ2h0OwoKICAvLyBVcGRhdGUgTGlua3MKICBpZiAoZXhpc3RpbmdOb2RlIC0+IHJpZ2h0ICE9IG51bGxwdHIpIHsKICAgIGV4aXN0aW5nTm9kZSAtPiByaWdodCAtPiBsZWZ0ID0gbmV3Tm9kZTsKICB9IGVsc2UgewogICAgdGFpbCA9IG5ld05vZGU7CiAgfQogIGV4aXN0aW5nTm9kZS0+cmlnaHQgPSBuZXdOb2RlOwoKICBub2RlTWFwW25ld1ZhbF0gPSBuZXdOb2RlOwp9Cgp2b2lkIGluc2VydEJlZm9yZShpbnQgbmV3VmFsLGludCBleGlzdGluZ1ZhbCwgaW50IGxhYmVsKSB7CiAgCgogICAgTm9kZSogZXhpc3RpbmdOb2RlID0gbm9kZU1hcFtleGlzdGluZ1ZhbF07CiAgICAKICAgIE5vZGUqIG5ld05vZGUgPSBuZXcgTm9kZSgpOwogICAgbmV3Tm9kZS0+dmFsdWUgPSBuZXdWYWw7CiAgICBuZXdOb2RlLT5hY3RpdmUgPSAxOwogICAgbmV3Tm9kZS0+bGFiZWwgPSBsYWJlbDsKICAgIG5ld05vZGUtPnJpZ2h0ID0gZXhpc3RpbmdOb2RlOwogICAgbmV3Tm9kZS0+bGVmdCA9IGV4aXN0aW5nTm9kZS0+bGVmdDsKICAgIAogIAogICAgaWYgKGV4aXN0aW5nTm9kZS0+bGVmdCAhPSBudWxscHRyKSB7CiAgICAgICAgZXhpc3RpbmdOb2RlLT5sZWZ0LT5yaWdodCA9IG5ld05vZGU7CiAgICB9IGVsc2UgewogICAgICAgIGhlYWQgPSBuZXdOb2RlOwogICAgfQogICAgZXhpc3RpbmdOb2RlLT5sZWZ0ID0gbmV3Tm9kZTsKICAgIAogICAgbm9kZU1hcFtuZXdWYWxdID0gbmV3Tm9kZTsKfQoKdm9pZCByZW1vdmUoaW50IHZhbCkgewogICAgTm9kZSogdGFyZ2V0ID0gbm9kZU1hcFt2YWxdOwogICAgCiAgICB0YXJnZXQgLT4gYWN0aXZlID0gMDsKICAgIC8vIGlmICh0YXJnZXQtPmxlZnQgIT0gbnVsbHB0cikgewogICAgLy8gICAgIHRhcmdldC0+bGVmdC0+cmlnaHQgPSB0YXJnZXQtPnJpZ2h0OwogICAgLy8gfSBlbHNlIHsKICAgIC8vICAgICBoZWFkID0gdGFyZ2V0LT5yaWdodDsgIAogICAgLy8gfQogICAgCiAgICAvLyBpZiAodGFyZ2V0LT5yaWdodCAhPSBudWxscHRyKSB7CiAgICAvLyAgICAgdGFyZ2V0LT5yaWdodC0+bGVmdCA9IHRhcmdldC0+bGVmdDsKICAgIC8vIH0gZWxzZSB7CiAgICAvLyAgICAgdGFpbCA9IHRhcmdldC0+bGVmdDsKICAgIC8vIH0KICAgIAogICAgLy8gUmVtb3ZlIGZyb20gbWFwIGFuZCBmcmVlIG1lbW9yeQogICAgbm9kZU1hcC5lcmFzZSh2YWwpOwogICAgLy8gZGVsZXRlIHRhcmdldDsKfQoKCnZvaWQgYnVpbGRGaW5hbEFycmF5KCkgewogICAgZmluYWxBci5jbGVhcigpOwogICAgLy8gMSBiYXNlIGluZGV4LCBwdXNoIGEgZHVtbXkgdmFsdWU7CiAgICBmaW5hbEFyLnB1c2hfYmFjayh7LTEsLTEsLTF9KTsKCiAgICBOb2RlKiBjdXIgPSBoZWFkOwogICAgaW50IGlkeCA9IDE7CiAgICB3aGlsZSAoY3VyICE9IG51bGxwdHIpIHsKICAgICAgICAvLyBjb3V0IDw8IGN1cnItPnZhbHVlOwogICAgICAgIGZpbmFsQXIucHVzaF9iYWNrKHtjdXItPnZhbHVlLGN1ci0+YWN0aXZlLGN1ci0+bGFiZWx9KTsKICAgICAgICBsYWJlbFRvSWR4W2N1ci0+bGFiZWxdID0gaWR4Kys7CiAgICAgICAgY3VyID0gY3VyLT5yaWdodDsKICAgIH0KICAgCiAgICAvLyBmb3IoaW50IGkgPSAwOyBpIDwgKGludClmaW5hbEFyLnNpemUoKTsgaSsrKXsKICAgIC8vICAgY291dCA8PCAiKCAiIDw8IGZpbmFsQXJbaV1bMF0gPDwgIiAiIDw8IGZpbmFsQXJbaV1bMV0gPDwgIiAiOwogICAgLy8gICBjb3V0IDw8IGZpbmFsQXJbaV1bMl0gPDwgIikgIjsKICAgIC8vIH0KICAgIC8vIGNvdXQgPDwgZW5kbDsKfQoKLy8gPT09PT09IFNlZ21lbnQgVHJlZSBQb3J0aW9uID09PT09PQovLyBpZHggMCA6IHN1bSwgaWR4IDE6IGNvdW50CmxsIHRyZWVJbmZvW04qNF1bMl07Cgp2b2lkIGJ1aWxkKGludCBuLGludCBiLGludCBlKSB7CiAgaWYgKGIgPT0gZSkgewogICAgdHJlZUluZm9bbl1bMF0gPSB0cmVlSW5mb1tuXVsxXSA9IDA7CiAgICBpZiAoZmluYWxBcltiXVsxXSA9PSAxKSB7CiAgICAgIHRyZWVJbmZvW25dWzBdID0gZmluYWxBcltiXVswXTsKICAgICAgdHJlZUluZm9bbl1bMV0gPTE7CiAgICB9CiAgICByZXR1cm47CiAgfQoKICBpbnQgbWlkID0gKGIgKyBlKSA+PiAxLCBsID0gbiA8PCAxLCByID0gbCB8IDE7CiAgYnVpbGQobCwgYiwgbWlkKTsKICBidWlsZChyLCBtaWQgKyAxLCBlKTsKICAvL21lcmdlCiAgdHJlZUluZm9bbl1bMF0gPSB0cmVlSW5mb1tsXVswXSArIHRyZWVJbmZvW3JdWzBdOwogIHRyZWVJbmZvW25dWzFdID0gdHJlZUluZm9bbF1bMV0gKyB0cmVlSW5mb1tyXVsxXTsKfQoKdm9pZCB1cGRhdGUoaW50IG4saW50IGIsaW50IGUsIGludCBpZHgsIGludCB2YWx1ZSkKewogIGlmIChiID4gaWR4IHx8IGUgPCBpZHgpIHJldHVybjsKICBpZiAoYiA9PSBlICYmIGIgPT0gaWR4KSB7CiAgICB0cmVlSW5mb1tuXVswXSA9IHZhbHVlOwogICAgaWYgKHZhbHVlID4gMCkgewogICAgICB0cmVlSW5mb1tuXVsxXSA9IDE7CiAgICB9CiAgICBlbHNlIHRyZWVJbmZvW25dWzFdID0gMDsKCiAgICByZXR1cm47CiAgfQoKICBpbnQgbWlkID0gKGIgKyBlKSA+PiAxLCBsID0gbiA8PCAxLCByID0gbCB8IDE7CiAgdXBkYXRlKGwsYixtaWQsaWR4LHZhbHVlKTsKICB1cGRhdGUocixtaWQrMSxlLGlkeCx2YWx1ZSk7CgogIC8vbWVyZ2UKICB0cmVlSW5mb1tuXVswXSA9IHRyZWVJbmZvW2xdWzBdICsgdHJlZUluZm9bcl1bMF07CiAgdHJlZUluZm9bbl1bMV0gPSB0cmVlSW5mb1tsXVsxXSArIHRyZWVJbmZvW3JdWzFdOwp9CgovLyByZXR1cm4gc3VtIG9mIGZpcnN0IG0gZWxlbWVudApsbCBxdWVyeShpbnQgbixpbnQgYixpbnQgZSwgaW50IG0pCnsKICBpZiAodHJlZUluZm9bbl1bMV0gPT0gbSkgcmV0dXJuIHRyZWVJbmZvW25dWzBdOwoKICBpbnQgbWlkID0gKGIgKyBlKSA+PiAxLCBsID0gbiA8PCAxLCByID0gbCB8IDE7CiAgaWYgKHRyZWVJbmZvW2xdWzFdID4gbSkgewogICAgcmV0dXJuIHF1ZXJ5KGwsYixtaWQsbSk7CiAgfSBlbHNlIHsKICAgIHJldHVybiB0cmVlSW5mb1tsXVswXSArIHF1ZXJ5KHIsbWlkKzEsZSwgbSAtIHRyZWVJbmZvW2xdWzFdKTsKICB9Cn0KCmludCBtYWluKCkKewogIC8vIGZhc3RpbzsKICBpbnQgcSxmaXJzdDsKICBjaW4gPj4gcSA+PiBmaXJzdDsKCiAgYXBwZW5kKGZpcnN0LDApOwogIG1hcDxpbnQsaW50PiBsYWJlbExvb2s7CiAgbGFiZWxMb29rW2ZpcnN0XSA9IDA7CiAgb3BlcmF0aW9uLnB1c2hfYmFjayh7LTEsZmlyc3QsLTF9KTsKCiAgZm9yKGludCBpID0gMTsgaSA8PSBxOyBpKyspewogICAgaW50IHR5cCA9IDAsIGwgPSAtMSwgciA9IC0xOwogICAgY2luID4+IHR5cDsKICAKICAgIGlmICh0eXAgPT0gMykgewogICAgICBjaW4gPj4gbDsKICAgICAgcmVtb3ZlKGwpOwogICAgICBvcGVyYXRpb24ucHVzaF9iYWNrKHt0eXAsbCxsYWJlbExvb2tbbF19KTsKICAgICAgbGFiZWxMb29rLmVyYXNlKGwpOwogICAgfSAKICAgIGVsc2UgewogICAgCiAgICAgIGNpbiA+PiBsID4+IHI7CgogICAgICBpZiAodHlwID09IDEpIHsKICAgICAgCiAgICAgICAgaW5zZXJ0QmVmb3JlKGwscixpKTsKICAgICAgICBsYWJlbExvb2tbbF0gPSBpOwogICAgICB9CiAgICAgIGVsc2UgaWYodHlwID09IDIpIHsKICAgICAgICBpbnNlcnRBZnRlcihsLHIsaSk7CiAgICAgICAgbGFiZWxMb29rW2xdID0gaTsKICAgICAgfQogICAgICBvcGVyYXRpb24ucHVzaF9iYWNrKHt0eXAsbCxyfSk7CiAgICB9CiAgIAogIH0KCiAgYnVpbGRGaW5hbEFycmF5KCk7CiAKICAvLyBidWlsZCB1cGRhdGUgcXVlcnkKICBpbnQgbiA9IGZpbmFsQXIuc2l6ZSgpIC0gMTsKICBidWlsZCgxLDEsbik7CgogIHZlY3RvcjxsbD4gb3V0cHV0OwoKICBmb3IoaW50IGkgPSBvcGVyYXRpb24uc2l6ZSgpLTE7IGkgPj0gMTsgaS0tKSB7CiAgICBpbnQgdHlwID0gb3BlcmF0aW9uW2ldWzBdOwogICAgaW50IGwgPSBvcGVyYXRpb25baV1bMV07CiAgICBpbnQgciA9IG9wZXJhdGlvbltpXVsyXTsKCiAgICBpZiAodHlwID09IDEgfHwgdHlwID09IDIpIHsKICAgICAgaW50IGlkeCA9IGxhYmVsVG9JZHhbaV07CiAgICAgIHVwZGF0ZSgxLDEsbixpZHgsMCk7CiAgICB9CiAgICBlbHNlIGlmICh0eXAgPT0gMykgewogICAgICBpbnQgaWR4ID0gbGFiZWxUb0lkeFtyXTsgLy8gciBpcyB0aGUgbGFiZWwgb2YgcmVtb3ZpbmcgbnVtYnIKICAgICAgdXBkYXRlKDEsMSxuLGlkeCxsKTsgLy8gbCBpcyB0aGUgdmFsdWUgb2YgcmVtb3ZlZCBudW1iZXIsIGFzIHdlIGl0ZXJhdGUgcmV2ZXJzZS4gYWRkIHRoZSBudW1iZXIKICAgIH0KICAgIGVsc2UgaWYgKHR5cCA9PSA0KSB7CiAgICAgIGxsIGFucyA9IHF1ZXJ5KDEsMSxuLHIpIC0gcXVlcnkoMSwxLG4sbC0xKTsKICAgICAgb3V0cHV0LnB1c2hfYmFjayhhbnMpOwogICAgfQogIH0KCiAKICBmb3IoaW50IGkgPSBvdXRwdXQuc2l6ZSgpLTE7IGkgPj0gMDsgaS0tKXsKICAgIGNvdXQgPDwgb3V0cHV0W2ldIDw8ICJcbiI7CiAgfQoKCiAgcmV0dXJuIDA7Cn0=