#include<bits/stdc++.h>
using namespace std;
static struct FastInput {
static constexpr int BUF_SIZE = 1 << 20;
char buf[BUF_SIZE];
size_t chars_read = 0;
size_t buf_pos = 0;
FILE *in = stdin;
char cur = 0;
inline char get_char() {
if (buf_pos >= chars_read) {
chars_read = fread(buf, 1, BUF_SIZE, in);
buf_pos = 0;
buf[0] = (chars_read == 0 ? -1 : buf[0]);
}
return cur = buf[buf_pos++];
}
inline void tie(int) {}
inline explicit operator bool() {
return cur != -1;
}
inline static bool is_blank(char c) {
return c <= ' ';
}
inline bool skip_blanks() {
while (is_blank(cur) && cur != -1) {
get_char();
}
return cur != -1;
}
inline FastInput& operator>>(char& c) {
skip_blanks();
c = cur;
return *this;
}
inline FastInput& operator>>(string& s) {
if (skip_blanks()) {
s.clear();
do {
s += cur;
} while (!is_blank(get_char()));
}
return *this;
}
template <typename T>
inline FastInput& read_integer(T& n) {
// unsafe, doesn't check that characters are actually digits
n = 0;
if (skip_blanks()) {
int sign = +1;
if (cur == '-') {
sign = -1;
get_char();
}
do {
n += n + (n << 3) + cur - '0';
} while (!is_blank(get_char()));
n *= sign;
}
return *this;
}
template <typename T>
inline typename enable_if<is_integral<T>::value, FastInput&>::type operator>>(T& n) {
return read_integer(n);
}
#if !defined(_WIN32) || defined(_WIN64)
inline FastInput& operator>>(__int128& n) {
return read_integer(n);
}
#endif
template <typename T>
inline typename enable_if<is_floating_point<T>::value, FastInput&>::type operator>>(T& n) {
// not sure if really fast, for compatibility only
n = 0;
if (skip_blanks()) {
string s;
(*this) >> s;
sscanf(s.c_str(), "%lf", &n);
}
return *this;
}
} fast_input;
#define cin fast_input
#define ii pair<int,int>
#define fi first
#define se second
//#define int long long
#define FOR(i, a, b) for(int i = (a); i <= (b); i++)
#define ll long long
#define ld double
#define mp make_pair
#define lg2 30
#define iii pair<int,ii>
#define iiii pair<ii,ii>
#define base 29
#define eps 1e-8
#define MASK(i) (1LL << (i))
#define BIT(S, i) (((S) >> (i)) & 1)
int dx[]= {0LL,0LL,1,-1,1,1,-1,-1};
int dy[]= {1,-1,0LL,0LL,1,-1,1,-1};
const int maxn=1e5+1,S=600,size_S=maxn/S+2;
const int mod=1e9+7;
struct FEN
{
int n;
ll bit1[S+1],bit2[S+1];
FEN() {};
FEN(int _n):n(_n+1)
{
};
ll get(ll bit[] ,int r)
{
ll ret = 0;
for (; r > 0; r = (r & (r + 1)) - 1)
ret += bit[r];
return ret;
}
void update(ll bit[],int idx, int delta)
{
for (; idx < n; idx = idx | (idx + 1))
bit[idx] += delta;
}
void updateRange(int l, int r, int v)
{
update(bit1, l, (n - l + 1) * v);
update(bit1, r + 1,-(n - r) * v);
update(bit2, l, v);
update(bit2, r + 1, -v);
}
ll pre(int u)
{
return get(bit1, u) - get(bit2, u) *1LL* (n - u);
}
ll getRange(int l, int r)
{
if(l>r)return 0;
return pre(r) - (l == 1 ? 0 : pre(l - 1));
}
} bit[size_S];
int n,L[size_S],R[size_S],q,pos[maxn],p[maxn],cnt,id[maxn];
ll lazy[size_S];
vector<int> nen[size_S];
struct Query {
int type, l, r, x;
} Q[maxn];
struct SegmentTree {
int n;
vector<ll> node, lazy;
SegmentTree(int n = 0): n(n), node((n << 2) + 5, 0), lazy((n << 2) + 5, 0) {}
void pushDown(int id, int l, int r) {
ll &t = lazy[id];
if (t) {
int mid = (l + r) >> 1;
node[id << 1] += t * (mid - l + 1);
node[id << 1 | 1] += t * (r - mid);
lazy[id << 1] += t;
lazy[id << 1 | 1] += t;
t = 0;
}
}
void update(int id, int l, int r, int u, int v, int k) {
if (l > v || r < u) return;
if (u <= l && r <= v) {
node[id] += 1LL * (r - l + 1) * k;
lazy[id] += k;
return;
}
pushDown(id, l, r);
int mid = (l + r) >> 1;
update(id << 1, l, mid, u, v, k);
update(id << 1 | 1, mid + 1, r, u, v, k);
node[id] = node[id << 1] + node[id << 1 | 1];
}
ll getSum(int id, int l, int r, int u, int v) {
if (l > v || r < u) return 0;
if (u <= l && r <= v) return node[id];
pushDown(id, l, r);
int mid = (l + r) >> 1;
return getSum(id << 1, l, mid, u, v) + getSum(id << 1 | 1, mid + 1, r, u, v);
}
} IT;
namespace Subtask2 {
bool check() {
FOR(i, 1, q) if (Q[i].type != 1 && Q[i].type != 3)
return false;
return true;
}
void solve() {
IT = SegmentTree(n);
FOR(i, 1, q) {
if (Q[i].type == 1) IT.update(1, 1, n, Q[i].l, Q[i].r, Q[i].x);
else cout << IT.getSum(1, 1, n, Q[i].l, Q[i].r) << '\n';
}
}
}
void solve0(int l,int r,int w)
{
int x=id[l],y=id[r];
if(x==y)
{
for(int i=l; i<=r; i++)
{
bit[x].updateRange(pos[i],pos[i],w);
}
return;
}
for(int i=x+1; i<=y-1; i++)
{
lazy[i]+=w;
}
if(R[x]-l+1<=l-1-L[x]+1)
for(int i=l; i<=R[x]; i++)
{
bit[x].updateRange(pos[i],pos[i],w);
}
else
{
lazy[x]+=w;
for(int i=L[x];i<=l-1;i++)
bit[x].updateRange(pos[i],pos[i],-w);
}
if(r-L[y]+1<=R[y]-(r+1)+1)
for(int i=L[y]; i<=r; i++)
{
bit[y].updateRange(pos[i],pos[i],w);
}
else
{
lazy[y]+=w;
for(int i=r+1;i<=R[y];i++)
bit[y].updateRange(pos[i],pos[i],-w);
}
}
void solve1(int l,int r,int w)
{
for(int i=1;i<=cnt;i++)
{
int u=lower_bound(nen[i].begin(),nen[i].end(),l)-nen[i].begin()+1,
v= (r >= nen[i].back() ? nen[i].size() : upper_bound(nen[i].begin()+u-1,nen[i].end(),r)-nen[i].begin());
if(u>v)continue;
if(v-u+1==R[i]-L[i]+1)
lazy[i]+=w;
else
bit[i].updateRange(u,v,w);
}
}
void solve2(int l,int r)
{
int x=id[l],y=id[r];
ll ans=0;
if(x==y)
{
for(int i=l; i<=r; i++)
{
ans+=bit[x].getRange(pos[i],pos[i]);
}
ans+=1LL*(r-l+1)*lazy[x];
cout<<ans<<'\n';
return;
}
for(int i=x+1; i<=y-1; i++)
{
ans+=bit[i].getRange(1,R[i]-L[i]+1)+(R[i]-L[i]+1)*lazy[i];
}
for(int i=l; i<=R[x]; i++)
{
ans+=bit[x].getRange(pos[i],pos[i]);
}
ans+=1LL*(R[x]-l+1)*lazy[x];
for(int i=L[y]; i<=r; i++)
{
ans+=bit[y].getRange(pos[i],pos[i]);
}
ans+=1LL*(r-L[y]+1)*lazy[y];
cout<<ans<<'\n';
}
void solve3(int l,int r)
{
ll ans=0;
for(int i=1;i<=cnt;i++)
{
int u=lower_bound(nen[i].begin(),nen[i].end(),l)-nen[i].begin()+1,
v= (r >= nen[i].back() ? nen[i].size() : upper_bound(nen[i].begin()+u-1,nen[i].end(),r)-nen[i].begin());
ans+=bit[i].getRange(u,v)+1LL*(v-u+1)*lazy[i];
}
cout<<ans<<'\n';
}
signed main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
#define task "task"
if(fopen(task".inp","r"))
{
freopen(task".inp","r",stdin);
freopen(task".out","w",stdout);
}
cin>>n>>q;
for(int i=1; i<=n; i++)
{
cin>>p[i];
pos[p[i]]=i;
}
FOR(i, 1, q) {
cin >> Q[i].type >> Q[i].l >> Q[i].r;
if (Q[i].type <= 1) cin >> Q[i].x;
}
if (Subtask2 :: check()) {
Subtask2 :: solve();
return 0;
}
cnt=0;
for(int i=1; i<=n; i+=S)
{
cnt++;
L[cnt]=i;
R[cnt]=min(n,i+S-1);
bit[cnt]=FEN(R[cnt]-L[cnt]+1);
for(int j=i; j<=R[cnt]; j++)
{
id[j]=cnt;
nen[cnt].push_back(pos[j]);
}
sort(nen[cnt].begin(),nen[cnt].end());
int j=0;
for(int j=i;j<=R[cnt];j++)
{
pos[j]=lower_bound(nen[cnt].begin(),nen[cnt].end(),pos[j])-nen[cnt].begin()+1;
}
}
FOR(i, 1, q)
{
int t = Q[i].type;
if(t==0)
{
solve0(Q[i].l,Q[i].r,Q[i].x);
}
else if(t==1)
{
solve1(Q[i].l,Q[i].r,Q[i].x);
}
else if(t==2)
{
solve2(Q[i].l,Q[i].r);
}
else
{
solve3(Q[i].l,Q[i].r);
}
}
cerr <<endl<< "TIME : " << clock() * 0.001 << "s" << endl ;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKc3RhdGljIHN0cnVjdCBGYXN0SW5wdXQgewogIHN0YXRpYyBjb25zdGV4cHIgaW50IEJVRl9TSVpFID0gMSA8PCAyMDsKICBjaGFyIGJ1ZltCVUZfU0laRV07CiAgc2l6ZV90IGNoYXJzX3JlYWQgPSAwOwogIHNpemVfdCBidWZfcG9zID0gMDsKICBGSUxFICppbiA9IHN0ZGluOwogIGNoYXIgY3VyID0gMDsKCiAgaW5saW5lIGNoYXIgZ2V0X2NoYXIoKSB7CiAgICBpZiAoYnVmX3BvcyA+PSBjaGFyc19yZWFkKSB7CiAgICAgIGNoYXJzX3JlYWQgPSBmcmVhZChidWYsIDEsIEJVRl9TSVpFLCBpbik7CiAgICAgIGJ1Zl9wb3MgPSAwOwogICAgICBidWZbMF0gPSAoY2hhcnNfcmVhZCA9PSAwID8gLTEgOiBidWZbMF0pOwogICAgfQogICAgcmV0dXJuIGN1ciA9IGJ1ZltidWZfcG9zKytdOwogIH0KCiAgaW5saW5lIHZvaWQgdGllKGludCkge30KCiAgaW5saW5lIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSB7CiAgICByZXR1cm4gY3VyICE9IC0xOwogIH0KCiAgaW5saW5lIHN0YXRpYyBib29sIGlzX2JsYW5rKGNoYXIgYykgewogICAgcmV0dXJuIGMgPD0gJyAnOwogIH0KCiAgaW5saW5lIGJvb2wgc2tpcF9ibGFua3MoKSB7CiAgICB3aGlsZSAoaXNfYmxhbmsoY3VyKSAmJiBjdXIgIT0gLTEpIHsKICAgICAgZ2V0X2NoYXIoKTsKICAgIH0KICAgIHJldHVybiBjdXIgIT0gLTE7CiAgfQoKICBpbmxpbmUgRmFzdElucHV0JiBvcGVyYXRvcj4+KGNoYXImIGMpIHsKICAgIHNraXBfYmxhbmtzKCk7CiAgICBjID0gY3VyOwogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgaW5saW5lIEZhc3RJbnB1dCYgb3BlcmF0b3I+PihzdHJpbmcmIHMpIHsKICAgIGlmIChza2lwX2JsYW5rcygpKSB7CiAgICAgIHMuY2xlYXIoKTsKICAgICAgZG8gewogICAgICAgIHMgKz0gY3VyOwogICAgICB9IHdoaWxlICghaXNfYmxhbmsoZ2V0X2NoYXIoKSkpOwogICAgfQogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgaW5saW5lIEZhc3RJbnB1dCYgcmVhZF9pbnRlZ2VyKFQmIG4pIHsKICAgIC8vIHVuc2FmZSwgZG9lc24ndCBjaGVjayB0aGF0IGNoYXJhY3RlcnMgYXJlIGFjdHVhbGx5IGRpZ2l0cwogICAgbiA9IDA7CiAgICBpZiAoc2tpcF9ibGFua3MoKSkgewogICAgICBpbnQgc2lnbiA9ICsxOwogICAgICBpZiAoY3VyID09ICctJykgewogICAgICAgIHNpZ24gPSAtMTsKICAgICAgICBnZXRfY2hhcigpOwogICAgICB9CiAgICAgIGRvIHsKICAgICAgICBuICs9IG4gKyAobiA8PCAzKSArIGN1ciAtICcwJzsKICAgICAgfSB3aGlsZSAoIWlzX2JsYW5rKGdldF9jaGFyKCkpKTsKICAgICAgbiAqPSBzaWduOwogICAgfQogICAgcmV0dXJuICp0aGlzOwogIH0KCiAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgaW5saW5lIHR5cGVuYW1lIGVuYWJsZV9pZjxpc19pbnRlZ3JhbDxUPjo6dmFsdWUsIEZhc3RJbnB1dCY+Ojp0eXBlIG9wZXJhdG9yPj4oVCYgbikgewogICAgcmV0dXJuIHJlYWRfaW50ZWdlcihuKTsKICB9CgogICNpZiAhZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX1dJTjY0KQogIGlubGluZSBGYXN0SW5wdXQmIG9wZXJhdG9yPj4oX19pbnQxMjgmIG4pIHsKICAgIHJldHVybiByZWFkX2ludGVnZXIobik7CiAgfQogICNlbmRpZgoKICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICBpbmxpbmUgdHlwZW5hbWUgZW5hYmxlX2lmPGlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSwgRmFzdElucHV0Jj46OnR5cGUgb3BlcmF0b3I+PihUJiBuKSB7CiAgICAvLyBub3Qgc3VyZSBpZiByZWFsbHkgZmFzdCwgZm9yIGNvbXBhdGliaWxpdHkgb25seQogICAgbiA9IDA7CiAgICBpZiAoc2tpcF9ibGFua3MoKSkgewogICAgICBzdHJpbmcgczsKICAgICAgKCp0aGlzKSA+PiBzOwogICAgICBzc2NhbmYocy5jX3N0cigpLCAiJWxmIiwgJm4pOwogICAgfQogICAgcmV0dXJuICp0aGlzOwogIH0KfSBmYXN0X2lucHV0OwoKI2RlZmluZSBjaW4gZmFzdF9pbnB1dAojZGVmaW5lIGlpIHBhaXI8aW50LGludD4KI2RlZmluZSBmaSBmaXJzdAojZGVmaW5lIHNlIHNlY29uZAovLyNkZWZpbmUgaW50IGxvbmcgbG9uZwojZGVmaW5lIEZPUihpLCBhLCBiKSBmb3IoaW50IGkgPSAoYSk7IGkgPD0gKGIpOyBpKyspCiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgbGQgZG91YmxlCiNkZWZpbmUgbXAgbWFrZV9wYWlyCiNkZWZpbmUgbGcyIDMwCiNkZWZpbmUgaWlpIHBhaXI8aW50LGlpPgojZGVmaW5lIGlpaWkgcGFpcjxpaSxpaT4KI2RlZmluZSBiYXNlIDI5CiNkZWZpbmUgZXBzIDFlLTgKI2RlZmluZSBNQVNLKGkpICgxTEwgPDwgKGkpKQojZGVmaW5lIEJJVChTLCBpKSAoKChTKSA+PiAoaSkpICYgMSkKaW50IGR4W109IHswTEwsMExMLDEsLTEsMSwxLC0xLC0xfTsKaW50IGR5W109IHsxLC0xLDBMTCwwTEwsMSwtMSwxLC0xfTsKY29uc3QgaW50IG1heG49MWU1KzEsUz02MDAsc2l6ZV9TPW1heG4vUysyOwpjb25zdCBpbnQgbW9kPTFlOSs3OwoKc3RydWN0IEZFTgp7CiAgICBpbnQgbjsKICAgIGxsIGJpdDFbUysxXSxiaXQyW1MrMV07CiAgICBGRU4oKSB7fTsKICAgIEZFTihpbnQgX24pOm4oX24rMSkKICAgIHsKICAgIH07CiAgICBsbCBnZXQobGwgYml0W10gLGludCByKQogICAgewogICAgICAgIGxsIHJldCA9IDA7CiAgICAgICAgZm9yICg7IHIgPiAwOyByID0gKHIgJiAociArIDEpKSAtIDEpCiAgICAgICAgICAgIHJldCArPSBiaXRbcl07CiAgICAgICAgcmV0dXJuIHJldDsKICAgIH0KICAgIHZvaWQgdXBkYXRlKGxsIGJpdFtdLGludCBpZHgsIGludCBkZWx0YSkKICAgIHsKICAgICAgICBmb3IgKDsgaWR4IDwgbjsgaWR4ID0gaWR4IHwgKGlkeCArIDEpKQogICAgICAgICAgICBiaXRbaWR4XSArPSBkZWx0YTsKICAgIH0KICAgIHZvaWQgdXBkYXRlUmFuZ2UoaW50IGwsIGludCByLCBpbnQgdikKICAgIHsKICAgICAgICB1cGRhdGUoYml0MSwgbCwgKG4gLSBsICsgMSkgKiB2KTsKICAgICAgICB1cGRhdGUoYml0MSwgciArIDEsLShuIC0gcikgKiB2KTsKICAgICAgICB1cGRhdGUoYml0MiwgbCwgdik7CiAgICAgICAgdXBkYXRlKGJpdDIsIHIgKyAxLCAtdik7CiAgICB9CiAgICBsbCBwcmUoaW50IHUpCiAgICB7CiAgICAgICAgcmV0dXJuIGdldChiaXQxLCB1KSAtIGdldChiaXQyLCB1KSAqMUxMKiAobiAtIHUpOwogICAgfQoKICAgIGxsIGdldFJhbmdlKGludCBsLCBpbnQgcikKICAgIHsKICAgICAgICBpZihsPnIpcmV0dXJuIDA7CiAgICAgICAgcmV0dXJuIHByZShyKSAtIChsID09IDEgPyAwIDogcHJlKGwgLSAxKSk7CiAgICB9Cn0gYml0W3NpemVfU107CmludCBuLExbc2l6ZV9TXSxSW3NpemVfU10scSxwb3NbbWF4bl0scFttYXhuXSxjbnQsaWRbbWF4bl07CmxsIGxhenlbc2l6ZV9TXTsKdmVjdG9yPGludD4gbmVuW3NpemVfU107CgpzdHJ1Y3QgUXVlcnkgewogICAgaW50IHR5cGUsIGwsIHIsIHg7Cn0gUVttYXhuXTsKCnN0cnVjdCBTZWdtZW50VHJlZSB7CiAgICBpbnQgbjsKICAgIHZlY3RvcjxsbD4gbm9kZSwgbGF6eTsKCiAgICBTZWdtZW50VHJlZShpbnQgbiA9IDApOiBuKG4pLCBub2RlKChuIDw8IDIpICsgNSwgMCksIGxhenkoKG4gPDwgMikgKyA1LCAwKSB7fQoKICAgIHZvaWQgcHVzaERvd24oaW50IGlkLCBpbnQgbCwgaW50IHIpIHsKICAgICAgICBsbCAmdCA9IGxhenlbaWRdOwogICAgICAgIGlmICh0KSB7CiAgICAgICAgICAgIGludCBtaWQgPSAobCArIHIpID4+IDE7CiAgICAgICAgICAgIG5vZGVbaWQgPDwgMV0gKz0gdCAqIChtaWQgLSBsICsgMSk7CiAgICAgICAgICAgIG5vZGVbaWQgPDwgMSB8IDFdICs9IHQgKiAociAtIG1pZCk7CiAgICAgICAgICAgIGxhenlbaWQgPDwgMV0gKz0gdDsKICAgICAgICAgICAgbGF6eVtpZCA8PCAxIHwgMV0gKz0gdDsKICAgICAgICAgICAgdCA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIHZvaWQgdXBkYXRlKGludCBpZCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYsIGludCBrKSB7CiAgICAgICAgaWYgKGwgPiB2IHx8IHIgPCB1KSByZXR1cm47CiAgICAgICAgaWYgKHUgPD0gbCAmJiByIDw9IHYpIHsKICAgICAgICAgICAgbm9kZVtpZF0gKz0gMUxMICogKHIgLSBsICsgMSkgKiBrOwogICAgICAgICAgICBsYXp5W2lkXSArPSBrOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHB1c2hEb3duKGlkLCBsLCByKTsKICAgICAgICBpbnQgbWlkID0gKGwgKyByKSA+PiAxOwogICAgICAgIHVwZGF0ZShpZCA8PCAxLCBsLCBtaWQsIHUsIHYsIGspOwogICAgICAgIHVwZGF0ZShpZCA8PCAxIHwgMSwgbWlkICsgMSwgciwgdSwgdiwgayk7CiAgICAgICAgbm9kZVtpZF0gPSBub2RlW2lkIDw8IDFdICsgbm9kZVtpZCA8PCAxIHwgMV07CiAgICB9CgogICAgbGwgZ2V0U3VtKGludCBpZCwgaW50IGwsIGludCByLCBpbnQgdSwgaW50IHYpIHsKICAgICAgICBpZiAobCA+IHYgfHwgciA8IHUpIHJldHVybiAwOwogICAgICAgIGlmICh1IDw9IGwgJiYgciA8PSB2KSByZXR1cm4gbm9kZVtpZF07CiAgICAgICAgcHVzaERvd24oaWQsIGwsIHIpOwogICAgICAgIGludCBtaWQgPSAobCArIHIpID4+IDE7CiAgICAgICAgcmV0dXJuIGdldFN1bShpZCA8PCAxLCBsLCBtaWQsIHUsIHYpICsgZ2V0U3VtKGlkIDw8IDEgfCAxLCBtaWQgKyAxLCByLCB1LCB2KTsKICAgIH0KfSBJVDsKCm5hbWVzcGFjZSBTdWJ0YXNrMiB7CiAgICBib29sIGNoZWNrKCkgewogICAgICAgIEZPUihpLCAxLCBxKSBpZiAoUVtpXS50eXBlICE9IDEgJiYgUVtpXS50eXBlICE9IDMpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICB2b2lkIHNvbHZlKCkgewoJCUlUID0gU2VnbWVudFRyZWUobik7CiAgICAgICAgRk9SKGksIDEsIHEpIHsKICAgICAgICAgICAgaWYgKFFbaV0udHlwZSA9PSAxKSBJVC51cGRhdGUoMSwgMSwgbiwgUVtpXS5sLCBRW2ldLnIsIFFbaV0ueCk7CiAgICAgICAgICAgIGVsc2UgY291dCA8PCBJVC5nZXRTdW0oMSwgMSwgbiwgUVtpXS5sLCBRW2ldLnIpIDw8ICdcbic7CiAgICAgICAgfQogICAgfQp9CgoKdm9pZCBzb2x2ZTAoaW50IGwsaW50IHIsaW50IHcpCnsKICAgIGludCB4PWlkW2xdLHk9aWRbcl07CiAgICBpZih4PT15KQogICAgewogICAgICAgIGZvcihpbnQgaT1sOyBpPD1yOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBiaXRbeF0udXBkYXRlUmFuZ2UocG9zW2ldLHBvc1tpXSx3KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgZm9yKGludCBpPXgrMTsgaTw9eS0xOyBpKyspCiAgICB7CiAgICAgICAgbGF6eVtpXSs9dzsKICAgIH0KICAgIGlmKFJbeF0tbCsxPD1sLTEtTFt4XSsxKQogICAgZm9yKGludCBpPWw7IGk8PVJbeF07IGkrKykKICAgIHsKICAgICAgICBiaXRbeF0udXBkYXRlUmFuZ2UocG9zW2ldLHBvc1tpXSx3KTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBsYXp5W3hdKz13OwogICAgICAgIGZvcihpbnQgaT1MW3hdO2k8PWwtMTtpKyspCiAgICAgICAgYml0W3hdLnVwZGF0ZVJhbmdlKHBvc1tpXSxwb3NbaV0sLXcpOwogICAgfQogICAgaWYoci1MW3ldKzE8PVJbeV0tKHIrMSkrMSkKICAgIGZvcihpbnQgaT1MW3ldOyBpPD1yOyBpKyspCiAgICB7CiAgICAgICAgYml0W3ldLnVwZGF0ZVJhbmdlKHBvc1tpXSxwb3NbaV0sdyk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgbGF6eVt5XSs9dzsKICAgICAgICBmb3IoaW50IGk9cisxO2k8PVJbeV07aSsrKQogICAgICAgIGJpdFt5XS51cGRhdGVSYW5nZShwb3NbaV0scG9zW2ldLC13KTsKICAgIH0KfQp2b2lkIHNvbHZlMShpbnQgbCxpbnQgcixpbnQgdykKewogICAgZm9yKGludCBpPTE7aTw9Y250O2krKykKICAgIHsKICAgICAgICBpbnQgdT1sb3dlcl9ib3VuZChuZW5baV0uYmVnaW4oKSxuZW5baV0uZW5kKCksbCktbmVuW2ldLmJlZ2luKCkrMSwKICAgICAgICAgICAgdj0gKHIgPj0gbmVuW2ldLmJhY2soKSA/IG5lbltpXS5zaXplKCkgOiB1cHBlcl9ib3VuZChuZW5baV0uYmVnaW4oKSt1LTEsbmVuW2ldLmVuZCgpLHIpLW5lbltpXS5iZWdpbigpKTsKICAgICAgICAgICAgaWYodT52KWNvbnRpbnVlOwogICAgICAgICAgICBpZih2LXUrMT09UltpXS1MW2ldKzEpCiAgICAgICAgICAgIGxhenlbaV0rPXc7CiAgICAgICAgICAgZWxzZQogICAgICAgICAgICBiaXRbaV0udXBkYXRlUmFuZ2UodSx2LHcpOwogICAgfQp9CnZvaWQgc29sdmUyKGludCBsLGludCByKQp7CiAgICBpbnQgeD1pZFtsXSx5PWlkW3JdOwogICAgbGwgYW5zPTA7CiAgICBpZih4PT15KQogICAgewogICAgICAgIGZvcihpbnQgaT1sOyBpPD1yOyBpKyspCiAgICAgICAgewogICAgICAgICAgICBhbnMrPWJpdFt4XS5nZXRSYW5nZShwb3NbaV0scG9zW2ldKTsKICAgICAgICB9CiAgICAgICAgYW5zKz0xTEwqKHItbCsxKSpsYXp5W3hdOwogICAgICAgIGNvdXQ8PGFuczw8J1xuJzsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBmb3IoaW50IGk9eCsxOyBpPD15LTE7IGkrKykKICAgIHsKICAgICAgICBhbnMrPWJpdFtpXS5nZXRSYW5nZSgxLFJbaV0tTFtpXSsxKSsoUltpXS1MW2ldKzEpKmxhenlbaV07CiAgICB9CiAgICBmb3IoaW50IGk9bDsgaTw9Ult4XTsgaSsrKQogICAgewogICAgICAgIGFucys9Yml0W3hdLmdldFJhbmdlKHBvc1tpXSxwb3NbaV0pOwogICAgfQogICAgYW5zKz0xTEwqKFJbeF0tbCsxKSpsYXp5W3hdOwogICAgZm9yKGludCBpPUxbeV07IGk8PXI7IGkrKykKICAgIHsKICAgICAgICBhbnMrPWJpdFt5XS5nZXRSYW5nZShwb3NbaV0scG9zW2ldKTsKICAgIH0KICAgIGFucys9MUxMKihyLUxbeV0rMSkqbGF6eVt5XTsKICAgIGNvdXQ8PGFuczw8J1xuJzsKfQp2b2lkIHNvbHZlMyhpbnQgbCxpbnQgcikKewogICAgbGwgYW5zPTA7CiAgICBmb3IoaW50IGk9MTtpPD1jbnQ7aSsrKQogICAgewogICAgICAgIGludCB1PWxvd2VyX2JvdW5kKG5lbltpXS5iZWdpbigpLG5lbltpXS5lbmQoKSxsKS1uZW5baV0uYmVnaW4oKSsxLAogICAgICAgICAgICB2PSAociA+PSBuZW5baV0uYmFjaygpID8gbmVuW2ldLnNpemUoKSA6IHVwcGVyX2JvdW5kKG5lbltpXS5iZWdpbigpK3UtMSxuZW5baV0uZW5kKCksciktbmVuW2ldLmJlZ2luKCkpOwogICAgICAgICAgICBhbnMrPWJpdFtpXS5nZXRSYW5nZSh1LHYpKzFMTCoodi11KzEpKmxhenlbaV07CiAgICB9CiAgICBjb3V0PDxhbnM8PCdcbic7Cn0Kc2lnbmVkIG1haW4oKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOwogICAgY2luLnRpZSgwKTsKICAgIGNvdXQudGllKDApOwojZGVmaW5lIHRhc2sgInRhc2siCiAgICBpZihmb3Blbih0YXNrIi5pbnAiLCJyIikpCiAgICB7CiAgICAgICAgZnJlb3Blbih0YXNrIi5pbnAiLCJyIixzdGRpbik7CiAgICAgICAgZnJlb3Blbih0YXNrIi5vdXQiLCJ3IixzdGRvdXQpOwogICAgfQogICAgY2luPj5uPj5xOwogICAgZm9yKGludCBpPTE7IGk8PW47IGkrKykKICAgIHsKICAgICAgICAgY2luPj5wW2ldOwogICAgICAgICBwb3NbcFtpXV09aTsKICAgIH0KICAgIEZPUihpLCAxLCBxKSB7CiAgICAgICAgY2luID4+IFFbaV0udHlwZSA+PiBRW2ldLmwgPj4gUVtpXS5yOwogICAgICAgIGlmIChRW2ldLnR5cGUgPD0gMSkgY2luID4+IFFbaV0ueDsKICAgIH0KICAgIGlmIChTdWJ0YXNrMiA6OiBjaGVjaygpKSB7CiAgICAgICAgU3VidGFzazIgOjogc29sdmUoKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGNudD0wOwogICAgZm9yKGludCBpPTE7IGk8PW47IGkrPVMpCiAgICB7CiAgICAgICAgY250Kys7CiAgICAgICAgTFtjbnRdPWk7CiAgICAgICAgUltjbnRdPW1pbihuLGkrUy0xKTsKICAgICAgICBiaXRbY250XT1GRU4oUltjbnRdLUxbY250XSsxKTsKICAgICAgICBmb3IoaW50IGo9aTsgajw9UltjbnRdOyBqKyspCiAgICAgICAgewogICAgICAgICAgICBpZFtqXT1jbnQ7CiAgICAgICAgICAgIG5lbltjbnRdLnB1c2hfYmFjayhwb3Nbal0pOwogICAgICAgIH0KICAgICAgICBzb3J0KG5lbltjbnRdLmJlZ2luKCksbmVuW2NudF0uZW5kKCkpOwogICAgICAgIGludCBqPTA7CiAgICAgICAgZm9yKGludCBqPWk7ajw9UltjbnRdO2orKykKICAgICAgICB7CiAgICAgICAgICAgIHBvc1tqXT1sb3dlcl9ib3VuZChuZW5bY250XS5iZWdpbigpLG5lbltjbnRdLmVuZCgpLHBvc1tqXSktbmVuW2NudF0uYmVnaW4oKSsxOwogICAgICAgIH0KICAgIH0KRk9SKGksIDEsIHEpCiAgICB7CiAgICAgICAgaW50IHQgPSBRW2ldLnR5cGU7CiAgICAgICAgaWYodD09MCkKICAgICAgICB7CiAgICAgICAgICAgIHNvbHZlMChRW2ldLmwsUVtpXS5yLFFbaV0ueCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYodD09MSkKICAgICAgICB7CiAgICAgICAgICAgIHNvbHZlMShRW2ldLmwsUVtpXS5yLFFbaV0ueCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYodD09MikKICAgICAgICB7CiAgICAgICAgICAgIHNvbHZlMihRW2ldLmwsUVtpXS5yKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgc29sdmUzKFFbaV0ubCxRW2ldLnIpOwogICAgICAgIH0KICAgIH0KICAgIGNlcnIgPDxlbmRsPDwgIlRJTUUgOiAiIDw8IGNsb2NrKCkgKiAwLjAwMSA8PCAicyIgPDwgZW5kbCA7Cn0=