// FOR COMPETITIVE PROGRAMMING
/*
_____________ ________
| | / |
|____ ____| / _____|
| | / /
| | | |
| | | |
| | | |
__ | | | |
\ \___/ / | \_____
\ / \ |
\_______/ \_________|
Murder, drugs, cash, and greed
It touches everyone and everything
Within the walls there's no escaping the disease
Sidewalks turn to pharmacies
All the pimps and pushers territories
Dollars pouring in from the victims trapped within
Schoolyard's a place of sorrow
Pray your children live to see tomorrow
A place where mothers cry, and kiss their dying sons goodbye
Living in a state of fear
Afraid of everything they see or hear
Someone they love may get shot
For drugs they never even bought!
Violence is a way of life
Revenge delivered with a gun or knife
Paybacks are a bitch
They'll leave you dying in a ditch
Caught in the hypnotic spell
Their life's story they'll never life to tell
In a hazy curtain, they can't see the end is certain
Imprisoned by narcotic chains
Life for some will never be the same
Trapped in walls of glass
Hoping that this all will pass
But some will find their way outside
Face the evil, eyes open wide
Break the bonds that pull you in
Escape the hell that thrives...
Within the walls
Of chaos and despair
Most are unemployed
Living on welfare
Prowling the halls
The vultures come to feed
On the flesh of those
Who are enslaved to the need
The final curtain falls
And no one sheds a fear
Their pleas for help always seem to fall
Upon deaf ears
Within the walls of chaos they forgot
That dignity and sanity
Are things that can't be bought
With every passing day
Another life is cast astray
Wear the wrong colors
And you might get blown away
Turn of a page
Another name's crossed off the list
Shot between the eyes
With a rig clenched in his fist
Driven to the grave
Ruled by need for kicks
Extract their own gold teeth
To satisfy their fix
There's cracks in the foundation
The time will soon arrive
When the walls will crumble down
And bury everyone alive!
Within the walls...
Within the walls of chaos...
Within the walls...
Within the walls of chaos...
Within the walls...
Within the walls of chaos!
*/
#include<bits/stdc++.h>
using namespace std;
#define run if(1)cout<<__LINE__<<endl;
#define Clear( a, b ) memset( a, b, sizeof( a ) )
#define swapp(v) swap(v[0],v[v.size()-1])
#define vvi vector<vector< int> >
#define vi vector<int>
#define ff first
#define ss second
#define no cout<<"NO"<<endl;
#define yes cout<<"YES"<<endl;
#define rep(i,n) for(int i=0;i<n;i++)
#define REP(i,j,n,k) for(int i=j;i<n;i+=k)
#define mp make_pair
#define pb push_back
#define pii pair<int,int>
#define piii pair<int,pair<int,int> >
#define piiii pair<pair<int,int>,pair<int,int> >
#define ll long long
#define llinf 1000000000000000000
#define inf 1000050000
#define MOD 1000000007
#define abs llabs
#define BOOST ios::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
inline long long max3(long long a, long long b,long long c){return (a)>(b)?((a)>(c)?(a):(c)):((b)>(c)?(b):(c));}
inline long long min3(long long a, long long b,long long c){return (a)<(b)?((a)<(c)?(a):(c)):((b)<(c)?(b):(c));}
//########################################################//
// for modinverse calculation // here MOD = 10^9+7
ll extgcd(ll a, ll b, ll &x, ll &y) { // ExtGCD
if (b == 0) {
x = 1;
y = 0;
return a;
}
ll d = extgcd(b, a%b, y, x);
y -= a / b * x;
return d;
}
inline ll mod(ll a, ll m) { // mod a wrt b
return (a % m + m) % m;
}
ll modinv(ll a) { // mod inverse a wrt 10^9+7
ll x, y;
extgcd(a, MOD, x, y);
return mod(x, MOD);
}
//#########################################################//
// GCD
ll gcd(ll u, ll v) {
ll r;
while (0 != v) {
r = u % v; u = v; v = r;
}
return u;
}
//###########################################################//
// LCM
ll lcm(ll u, ll v) {
return u/gcd(u,v)*v;
}
//##########################################################//
//void floyd_warshall(ll n){
// rep(i,n)rep(j,n)rep(k,n)d[j][k]=min(d[j][k],d[j][i]+d[i][k]);
//}
//##########################################################//
// Get all factors // cnt in 'a' array
void get_all_factors(int a[],ll int n){
ll int w=sqrt(n);
for(int i=1;i<=w;i++){
if(n%i==0){ a[i]++; a[n/i]++; } }
ll int x=ceil(sqrt(n)); if(sqrt(n)==ceil(sqrt(n))) a[(int)sqrt(n)]--;
}
//#################################//
// COMPUTE nCr
ll int memo[100000][110]={0};
ll C(ll n, ll r)
{
if(r==0 || r==n)
return 1;
if(memo[n][r] != -1) return memo[n][r];
return memo[n][r] = ( C(n-1, r-1) % MOD + C(n-1, r) % MOD ) % MOD;
}
//##########################################################//
// Dont use these variables------> mod,lcm,gcd,MOD,forn,mp,pb,modinv
// Usable shortcuts
// ff->first , ss->second , abs->>llabs , MOD , forn(j,n) , mp , pb , pii ,
// inf->10^9+5^5 ,
// functns:-->fast(a,n) a^n , gcd(u,v) , lcm(u,v) , mod(a,m) wrt m, modinv(a) wrt MOD, get_all_factors(a[],n) , Clear (a[],b) set all ai to val b,
// --------- -------- -------- ------- --------- --------------------- -------------
//###########################################//
// Debugging
int valid(string s, int i){ if(s=="lol" or i==-inf){ return 0; } return 1; }
void status(string s1="lol",ll int i1=-inf,string s2="lol",ll int i2=-inf,string s3="lol",ll int i3=-inf){
if(1){
if(valid(s1,i1)){ cout<<s1<<"="<<i1<<" "; }
if(valid(s2,i2)){ cout<<s2<<"="<<i2<<" "; }
if(valid(s3,i3)){ cout<<s3<<"="<<i3<<" "; }
cout<<endl;
} }
//###########################################//
// Compute power with or without MOD
ll int poww(ll b,ll e){if(e==0)return 1;else if(e%2==0){ll a=pow(b,e/2);return a*a;}else {ll a=pow(b,e/2);return b*a*a;}}
ll int powm(ll x,ll y,ll m=MOD){x=x%m;ll res=1;while(y){if(y&1)res=res*x;res%=m;y=y>>1;x=x*x;x%=m;}return res;}
//###########################################//
//## Segment Tree Reference
//
// build() function
// update() function
// lazy() function
// query() function
//###########################################//
// min and max segment tree in one code only
int c[1000000]={0};
int lazy[10000000]={0};
int mintree[10000000]={0};
int maxtree[10000000]={0};
void lazyprop(int index,int s,int e)
{
// cout<<"lazy"<<endl;
mintree[index]+=lazy[index];
maxtree[index]+=lazy[index];
if(s<e) // s!=e
{
int left=2*index;
int right=2*index+1;
lazy[left]+=lazy[index];
lazy[right]+=lazy[index];
lazy[index]=0; // most important part
}
return;
}
void build(int s,int e, int index)
{
// cout<<"index="<<index<<endl;
if(s>e)
{
return ;
}
if(s==e)
{
mintree[index]=c[s];
maxtree[index]=c[s];
return;
}
int mid=(s+e)>>1;
build(s,mid,2*index);
build(mid+1,e,2*index+1);
maxtree[index]=max(maxtree[2*index],maxtree[2*index+1]);
mintree[index]=min(mintree[2*index],mintree[2*index+1]);
return ;
}
void updaterange(int s,int e,int l,int r,int val,int index)
{
lazyprop(index,s,e);
// cout<<"updating "<<s<<" "<<e<<endl;
if(l<=s and e<=r)
{
//lazy[index]=val;
lazy[index]+=val;
lazyprop(index,s,e); // this lies completely in range,
return ;
}
if(s>r or e<l or s>e) // missed s>e case
{
return ;
}
int mid=(s+e)>>1;
updaterange(s,mid,l,r,val,2*index);
updaterange(mid+1,e,l,r,val,2*index+1);
maxtree[index]=max(maxtree[2*index],maxtree[2*index+1]);
mintree[index]=min(mintree[2*index],mintree[2*index+1]);
return ;
}
int querymax(int s,int e,int l,int r,int index)
{
lazyprop(index,s,e);
if(e<l or s>r or s>e) // missed s>e case
{
return -inf; // out of range
}
if(s>=l and e<=r)
{
return maxtree[index];
}
int mid=(s+e)>>1;
int lans=querymax(s,mid,l,r,2*index);
int rans=querymax(mid+1,e,l,r,2*index+1);
return max(lans,rans);
}
int querymin(int s,int e,int l,int r,int index)
{
lazyprop(index,s,e);
if(e<l or s>r or s>e) // missed s>e case
{
return +inf; // out of range
}
if(s>=l and e<=r)
{
return mintree[index];
}
int mid=(s+e)>>1;
int lans=querymin(s,mid,l,r,2*index);
int rans=querymin(mid+1,e,l,r,2*index+1);
return min(lans,rans);
}
int main()
{
BOOST
int t;
cin>>t;
while(t--)
{
int n,q;
cin>>n>>q;
int a[n+1]={0};
REP(i,1,n+1,1)
{
int a[i];
cin>>a[i];
c[i]=c[i-1]+a[i];
cout<<i<<" "<<c[i]<<endl;
}
build(1,n,1);
while(q--)
{
char c;
cin>>c;
if(c=='Q')
{
int l,r;
cin>>l>>r;
int cr=querymax(1,n,r,n,1);
int cl=querymin(1,n,1,l-1,1);
// cout<<cr<<" "<<cl<<" ans= ";
int ans=cr-cl;
cout<<"ans=";
cout<<ans<<endl;
}
else
{
int x,v;
cin>>x>>v;
updaterange(1,n,x,n,x-a[x],1); // made mistake in range to be updated // made mistake in update value , wrote just x there
a[x]=v;
}
}
}
}
//////////////////////////////////////////////
Ly8gRk9SIENPTVBFVElUSVZFIFBST0dSQU1NSU5HCi8qCiAgICBfX19fX19fX19fX19fICAgICAgX19fX19fX18KICAgfCAgICAgICAgICAgICB8ICAgIC8gICAgICAgIHwKICAgfF9fX18gICAgIF9fX198ICAgLyAgICBfX19fX3wKICAgICAgICB8ICAgIHwgICAgICAvICAgIC8KICAgICAgICB8ICAgIHwgICAgIHwgICAgfAogICAgICAgIHwgICAgfCAgICAgfCAgICB8CiAgICAgICAgfCAgICB8ICAgICB8ICAgIHwKICBfXyAgICB8ICAgIHwgICAgIHwgICAgfAogXCAgXF9fXy8gICAgLyAgICAgfCAgICAgXF9fX19fCiAgXCAgICAgICAgIC8gICAgICAgXCAgICAgICAgICB8CiAgIFxfX19fX19fLyAgICAgICAgIFxfX19fX19fX198CgoKCk11cmRlciwgZHJ1Z3MsIGNhc2gsIGFuZCBncmVlZApJdCB0b3VjaGVzIGV2ZXJ5b25lIGFuZCBldmVyeXRoaW5nCldpdGhpbiB0aGUgd2FsbHMgdGhlcmUncyBubyBlc2NhcGluZyB0aGUgZGlzZWFzZQpTaWRld2Fsa3MgdHVybiB0byBwaGFybWFjaWVzCkFsbCB0aGUgcGltcHMgYW5kIHB1c2hlcnMgdGVycml0b3JpZXMKRG9sbGFycyBwb3VyaW5nIGluIGZyb20gdGhlIHZpY3RpbXMgdHJhcHBlZCB3aXRoaW4KU2Nob29seWFyZCdzIGEgcGxhY2Ugb2Ygc29ycm93ClByYXkgeW91ciBjaGlsZHJlbiBsaXZlIHRvIHNlZSB0b21vcnJvdwpBIHBsYWNlIHdoZXJlIG1vdGhlcnMgY3J5LCBhbmQga2lzcyB0aGVpciBkeWluZyBzb25zIGdvb2RieWUKTGl2aW5nIGluIGEgc3RhdGUgb2YgZmVhcgpBZnJhaWQgb2YgZXZlcnl0aGluZyB0aGV5IHNlZSBvciBoZWFyClNvbWVvbmUgdGhleSBsb3ZlIG1heSBnZXQgc2hvdApGb3IgZHJ1Z3MgdGhleSBuZXZlciBldmVuIGJvdWdodCEKClZpb2xlbmNlIGlzIGEgd2F5IG9mIGxpZmUKUmV2ZW5nZSBkZWxpdmVyZWQgd2l0aCBhIGd1biBvciBrbmlmZQpQYXliYWNrcyBhcmUgYSBiaXRjaApUaGV5J2xsIGxlYXZlIHlvdSBkeWluZyBpbiBhIGRpdGNoCkNhdWdodCBpbiB0aGUgaHlwbm90aWMgc3BlbGwKVGhlaXIgbGlmZSdzIHN0b3J5IHRoZXknbGwgbmV2ZXIgbGlmZSB0byB0ZWxsCkluIGEgaGF6eSBjdXJ0YWluLCB0aGV5IGNhbid0IHNlZSB0aGUgZW5kIGlzIGNlcnRhaW4KSW1wcmlzb25lZCBieSBuYXJjb3RpYyBjaGFpbnMKTGlmZSBmb3Igc29tZSB3aWxsIG5ldmVyIGJlIHRoZSBzYW1lClRyYXBwZWQgaW4gd2FsbHMgb2YgZ2xhc3MKSG9waW5nIHRoYXQgdGhpcyBhbGwgd2lsbCBwYXNzCkJ1dCBzb21lIHdpbGwgZmluZCB0aGVpciB3YXkgb3V0c2lkZQpGYWNlIHRoZSBldmlsLCBleWVzIG9wZW4gd2lkZQpCcmVhayB0aGUgYm9uZHMgdGhhdCBwdWxsIHlvdSBpbgpFc2NhcGUgdGhlIGhlbGwgdGhhdCB0aHJpdmVzLi4uCgpXaXRoaW4gdGhlIHdhbGxzCk9mIGNoYW9zIGFuZCBkZXNwYWlyCk1vc3QgYXJlIHVuZW1wbG95ZWQKTGl2aW5nIG9uIHdlbGZhcmUKUHJvd2xpbmcgdGhlIGhhbGxzClRoZSB2dWx0dXJlcyBjb21lIHRvIGZlZWQKT24gdGhlIGZsZXNoIG9mIHRob3NlCldobyBhcmUgZW5zbGF2ZWQgdG8gdGhlIG5lZWQKVGhlIGZpbmFsIGN1cnRhaW4gZmFsbHMKQW5kIG5vIG9uZSBzaGVkcyBhIGZlYXIKVGhlaXIgcGxlYXMgZm9yIGhlbHAgYWx3YXlzIHNlZW0gdG8gZmFsbApVcG9uIGRlYWYgZWFycwpXaXRoaW4gdGhlIHdhbGxzIG9mIGNoYW9zIHRoZXkgZm9yZ290ClRoYXQgZGlnbml0eSBhbmQgc2FuaXR5CkFyZSB0aGluZ3MgdGhhdCBjYW4ndCBiZSBib3VnaHQKCldpdGggZXZlcnkgcGFzc2luZyBkYXkKQW5vdGhlciBsaWZlIGlzIGNhc3QgYXN0cmF5CldlYXIgdGhlIHdyb25nIGNvbG9ycwpBbmQgeW91IG1pZ2h0IGdldCBibG93biBhd2F5CgpUdXJuIG9mIGEgcGFnZQpBbm90aGVyIG5hbWUncyBjcm9zc2VkIG9mZiB0aGUgbGlzdApTaG90IGJldHdlZW4gdGhlIGV5ZXMKV2l0aCBhIHJpZyBjbGVuY2hlZCBpbiBoaXMgZmlzdAoKRHJpdmVuIHRvIHRoZSBncmF2ZQpSdWxlZCBieSBuZWVkIGZvciBraWNrcwpFeHRyYWN0IHRoZWlyIG93biBnb2xkIHRlZXRoClRvIHNhdGlzZnkgdGhlaXIgZml4CgpUaGVyZSdzIGNyYWNrcyBpbiB0aGUgZm91bmRhdGlvbgpUaGUgdGltZSB3aWxsIHNvb24gYXJyaXZlCldoZW4gdGhlIHdhbGxzIHdpbGwgY3J1bWJsZSBkb3duCkFuZCBidXJ5IGV2ZXJ5b25lIGFsaXZlIQoKV2l0aGluIHRoZSB3YWxscy4uLgpXaXRoaW4gdGhlIHdhbGxzIG9mIGNoYW9zLi4uCldpdGhpbiB0aGUgd2FsbHMuLi4KV2l0aGluIHRoZSB3YWxscyBvZiBjaGFvcy4uLgpXaXRoaW4gdGhlIHdhbGxzLi4uCldpdGhpbiB0aGUgd2FsbHMgb2YgY2hhb3MhCiovCgojaW5jbHVkZTxiaXRzL3N0ZGMrKy5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKI2RlZmluZSBydW4gaWYoMSljb3V0PDxfX0xJTkVfXzw8ZW5kbDsKI2RlZmluZSBDbGVhciggYSwgYiApIG1lbXNldCggYSwgYiwgc2l6ZW9mKCBhICkgKQoKI2RlZmluZSBzd2FwcCh2KSBzd2FwKHZbMF0sdlt2LnNpemUoKS0xXSkKCiNkZWZpbmUgdnZpIHZlY3Rvcjx2ZWN0b3I8IGludD4gPgojZGVmaW5lIHZpIHZlY3RvcjxpbnQ+CiNkZWZpbmUgZmYgZmlyc3QKI2RlZmluZSBzcyBzZWNvbmQKI2RlZmluZSBubyBjb3V0PDwiTk8iPDxlbmRsOwojZGVmaW5lIHllcyBjb3V0PDwiWUVTIjw8ZW5kbDsKCiNkZWZpbmUgcmVwKGksbikgZm9yKGludCBpPTA7aTxuO2krKykKI2RlZmluZSBSRVAoaSxqLG4saykgZm9yKGludCBpPWo7aTxuO2krPWspCiNkZWZpbmUgbXAgbWFrZV9wYWlyCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgcGlpICBwYWlyPGludCxpbnQ+CiNkZWZpbmUgcGlpaSBwYWlyPGludCxwYWlyPGludCxpbnQ+ID4KI2RlZmluZSBwaWlpaSBwYWlyPHBhaXI8aW50LGludD4scGFpcjxpbnQsaW50PiA+CiNkZWZpbmUgbGwgbG9uZyBsb25nCgojZGVmaW5lIGxsaW5mIDEwMDAwMDAwMDAwMDAwMDAwMDAKI2RlZmluZSBpbmYgMTAwMDA1MDAwMAojZGVmaW5lIE1PRCAxMDAwMDAwMDA3CiNkZWZpbmUgYWJzIGxsYWJzCiNkZWZpbmUgQk9PU1QgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAgY2luLnRpZShOVUxMKTsgY291dC50aWUoTlVMTCk7CgppbmxpbmUgbG9uZyBsb25nICBtYXgzKGxvbmcgbG9uZyAgYSwgbG9uZyBsb25nICBiLGxvbmcgbG9uZyAgYyl7cmV0dXJuIChhKT4oYik/KChhKT4oYyk/KGEpOihjKSk6KChiKT4oYyk/KGIpOihjKSk7fQppbmxpbmUgbG9uZyBsb25nICBtaW4zKGxvbmcgbG9uZyAgYSwgbG9uZyBsb25nIGIsbG9uZyBsb25nIGMpe3JldHVybiAoYSk8KGIpPygoYSk8KGMpPyhhKTooYykpOigoYik8KGMpPyhiKTooYykpO30KLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy8vCi8vIGZvciBtb2RpbnZlcnNlIGNhbGN1bGF0aW9uICAvLyBoZXJlIE1PRCA9IDEwXjkrNwpsbCBleHRnY2QobGwgYSwgbGwgYiwgbGwgJngsIGxsICZ5KSB7ICAgICAgICAgICAgICAgICAgICAgLy8gRXh0R0NECiAgICBpZiAoYiA9PSAwKSB7CiAgICAgICAgeCA9IDE7CiAgICAgICAgeSA9IDA7CiAgICAgICAgcmV0dXJuIGE7CiAgICB9CiAgICBsbCBkID0gZXh0Z2NkKGIsIGElYiwgeSwgeCk7CiAgICB5IC09IGEgLyBiICogeDsKICAgIHJldHVybiBkOwp9CgppbmxpbmUgbGwgbW9kKGxsIGEsIGxsIG0pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9kIGEgd3J0IGIKICAgIHJldHVybiAoYSAlIG0gKyBtKSAlIG07Cn0KCmxsIG1vZGludihsbCBhKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb2QgaW52ZXJzZSBhIHdydCAxMF45KzcKICAgIGxsIHgsIHk7CiAgICBleHRnY2QoYSwgTU9ELCB4LCB5KTsKICAgIHJldHVybiBtb2QoeCwgTU9EKTsKfQovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy8vCi8vIEdDRApsbCBnY2QobGwgdSwgbGwgdikgewogIGxsIHI7CiAgd2hpbGUgKDAgIT0gdikgewogICAgciA9IHUgJSB2OyB1ID0gdjsgdiA9IHI7CiAgfQogIHJldHVybiB1Owp9Ci8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMvLwovLyBMQ00KbGwgbGNtKGxsIHUsIGxsIHYpIHsKICByZXR1cm4gdS9nY2QodSx2KSp2Owp9Ci8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy8vCi8vdm9pZCBmbG95ZF93YXJzaGFsbChsbCBuKXsKLy8gIHJlcChpLG4pcmVwKGosbilyZXAoayxuKWRbal1ba109bWluKGRbal1ba10sZFtqXVtpXStkW2ldW2tdKTsKLy99Ci8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy8vCi8vIEdldCBhbGwgZmFjdG9ycyAgLy8gY250IGluICdhJyBhcnJheQp2b2lkIGdldF9hbGxfZmFjdG9ycyhpbnQgYVtdLGxsIGludCBuKXsKICAgIGxsIGludCB3PXNxcnQobik7CiAgICBmb3IoaW50IGk9MTtpPD13O2krKyl7CiAgICAgICAgaWYobiVpPT0wKXsgIGFbaV0rKzsgICBhW24vaV0rKzsgIH0gICB9CiAgICBsbCBpbnQgeD1jZWlsKHNxcnQobikpOyBpZihzcXJ0KG4pPT1jZWlsKHNxcnQobikpKSAgYVsoaW50KXNxcnQobildLS07Cn0KLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMvLwovLyBDT01QVVRFIG5DcgpsbCBpbnQgbWVtb1sxMDAwMDBdWzExMF09ezB9OwpsbCBDKGxsIG4sIGxsIHIpCnsKICAgIGlmKHI9PTAgfHwgcj09bikKICAgICAgICByZXR1cm4gMTsKICAgIGlmKG1lbW9bbl1bcl0gIT0gLTEpIHJldHVybiBtZW1vW25dW3JdOwogICAgcmV0dXJuIG1lbW9bbl1bcl0gPSAoIEMobi0xLCByLTEpICUgTU9EICsgQyhuLTEsIHIpICUgTU9EICkgJSBNT0Q7Cn0KLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjLy8KCi8vIERvbnQgdXNlIHRoZXNlIHZhcmlhYmxlcy0tLS0tLT4gbW9kLGxjbSxnY2QsTU9ELGZvcm4sbXAscGIsbW9kaW52CgovLyBVc2FibGUgc2hvcnRjdXRzCi8vIGZmLT5maXJzdCAsIHNzLT5zZWNvbmQgLCBhYnMtPj5sbGFicyAsIE1PRCAsIGZvcm4oaixuKSAsIG1wICwgcGIgLCBwaWkgLAovLyBpbmYtPjEwXjkrNV41ICwKCi8vIGZ1bmN0bnM6LS0+ZmFzdChhLG4pIGFebiAsIGdjZCh1LHYpICwgbGNtKHUsdikgLCBtb2QoYSxtKSB3cnQgbSwgbW9kaW52KGEpIHdydCBNT0QsIGdldF9hbGxfZmFjdG9ycyhhW10sbikgLCBDbGVhciAoYVtdLGIpIHNldCBhbGwgYWkgdG8gdmFsIGIsCi8vICAgICAgICAgICAgLS0tLS0tLS0tICAgICAgIC0tLS0tLS0tICAgLS0tLS0tLS0gICAtLS0tLS0tICAgICAgICAgLS0tLS0tLS0tICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tCi8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy8vCi8vIERlYnVnZ2luZwppbnQgdmFsaWQoc3RyaW5nIHMsIGludCBpKXsgaWYocz09ImxvbCIgb3IgaT09LWluZil7ICAgcmV0dXJuIDA7ICB9ICByZXR1cm4gMTsgfQp2b2lkIHN0YXR1cyhzdHJpbmcgczE9ImxvbCIsbGwgaW50IGkxPS1pbmYsc3RyaW5nIHMyPSJsb2wiLGxsIGludCBpMj0taW5mLHN0cmluZyBzMz0ibG9sIixsbCBpbnQgaTM9LWluZil7CmlmKDEpewppZih2YWxpZChzMSxpMSkpeyAgY291dDw8czE8PCI9Ijw8aTE8PCIgICI7ICB9CmlmKHZhbGlkKHMyLGkyKSl7ICBjb3V0PDxzMjw8Ij0iPDxpMjw8IiAgIjsgIH0KaWYodmFsaWQoczMsaTMpKXsgIGNvdXQ8PHMzPDwiPSI8PGkzPDwiICAiOyAgfQpjb3V0PDxlbmRsOwp9ICB9CgovLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMvLwovLyBDb21wdXRlIHBvd2VyIHdpdGggb3Igd2l0aG91dCBNT0QKCmxsIGludCBwb3d3KGxsIGIsbGwgZSl7aWYoZT09MClyZXR1cm4gMTtlbHNlIGlmKGUlMj09MCl7bGwgYT1wb3coYixlLzIpO3JldHVybiBhKmE7fWVsc2Uge2xsIGE9cG93KGIsZS8yKTtyZXR1cm4gYiphKmE7fX0KbGwgaW50IHBvd20obGwgeCxsbCB5LGxsIG09TU9EKXt4PXglbTtsbCByZXM9MTt3aGlsZSh5KXtpZih5JjEpcmVzPXJlcyp4O3JlcyU9bTt5PXk+PjE7eD14Kng7eCU9bTt9cmV0dXJuIHJlczt9Ci8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy8vCgovLyMjIFNlZ21lbnQgVHJlZSBSZWZlcmVuY2UKLy8KLy8gYnVpbGQoKSBmdW5jdGlvbgovLyB1cGRhdGUoKSBmdW5jdGlvbgovLyBsYXp5KCkgZnVuY3Rpb24KLy8gcXVlcnkoKSBmdW5jdGlvbgoKLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjLy8KCi8vIG1pbiBhbmQgbWF4IHNlZ21lbnQgdHJlZSBpbiBvbmUgY29kZSBvbmx5CgppbnQgY1sxMDAwMDAwXT17MH07CmludCBsYXp5WzEwMDAwMDAwXT17MH07CmludCBtaW50cmVlWzEwMDAwMDAwXT17MH07CmludCBtYXh0cmVlWzEwMDAwMDAwXT17MH07Cgp2b2lkIGxhenlwcm9wKGludCBpbmRleCxpbnQgcyxpbnQgZSkKewovLyAgICBjb3V0PDwibGF6eSI8PGVuZGw7CiAgICBtaW50cmVlW2luZGV4XSs9bGF6eVtpbmRleF07CiAgICBtYXh0cmVlW2luZGV4XSs9bGF6eVtpbmRleF07CiAgICBpZihzPGUpICAgIC8vIHMhPWUKICAgIHsKICAgICAgICBpbnQgbGVmdD0yKmluZGV4OwogICAgICAgIGludCByaWdodD0yKmluZGV4KzE7CiAgICAgICAgbGF6eVtsZWZ0XSs9bGF6eVtpbmRleF07CiAgICAgICAgbGF6eVtyaWdodF0rPWxhenlbaW5kZXhdOwogICAgICAgIGxhenlbaW5kZXhdPTA7ICAgICAgICAgICAgIC8vIG1vc3QgaW1wb3J0YW50IHBhcnQKICAgIH0KICAgIHJldHVybjsKfQoKdm9pZCBidWlsZChpbnQgcyxpbnQgZSwgaW50IGluZGV4KQp7Ci8vICAgIGNvdXQ8PCJpbmRleD0iPDxpbmRleDw8ZW5kbDsKICAgIGlmKHM+ZSkKICAgIHsKICAgICAgICByZXR1cm4gOwogICAgfQogICAgaWYocz09ZSkKICAgIHsKICAgICBtaW50cmVlW2luZGV4XT1jW3NdOwogICAgIG1heHRyZWVbaW5kZXhdPWNbc107CiAgICAgcmV0dXJuOwogICAgfQogICAgaW50IG1pZD0ocytlKT4+MTsKICAgIGJ1aWxkKHMsbWlkLDIqaW5kZXgpOwogICAgYnVpbGQobWlkKzEsZSwyKmluZGV4KzEpOwogICAgbWF4dHJlZVtpbmRleF09bWF4KG1heHRyZWVbMippbmRleF0sbWF4dHJlZVsyKmluZGV4KzFdKTsKICAgIG1pbnRyZWVbaW5kZXhdPW1pbihtaW50cmVlWzIqaW5kZXhdLG1pbnRyZWVbMippbmRleCsxXSk7CiAgICByZXR1cm4gOwp9Cgp2b2lkIHVwZGF0ZXJhbmdlKGludCBzLGludCBlLGludCBsLGludCByLGludCB2YWwsaW50IGluZGV4KQp7CiAgICBsYXp5cHJvcChpbmRleCxzLGUpOwoKICAgLy8gY291dDw8InVwZGF0aW5nICI8PHM8PCIgIjw8ZTw8ZW5kbDsKCiAgICBpZihsPD1zIGFuZCBlPD1yKQogICAgewogICAgICAgIC8vbGF6eVtpbmRleF09dmFsOwogICAgICAgIGxhenlbaW5kZXhdKz12YWw7CiAgICAgICAgbGF6eXByb3AoaW5kZXgscyxlKTsgICAgICAgICAvLyB0aGlzIGxpZXMgY29tcGxldGVseSBpbiByYW5nZSwKICAgICAgICByZXR1cm4gOwogICAgfQoKICAgIGlmKHM+ciBvciBlPGwgb3Igcz5lKSAgICAvLyBtaXNzZWQgcz5lIGNhc2UKICAgIHsKICAgICAgICByZXR1cm4gOwogICAgfQoKICAgIGludCBtaWQ9KHMrZSk+PjE7CiAgICB1cGRhdGVyYW5nZShzLG1pZCxsLHIsdmFsLDIqaW5kZXgpOwogICAgdXBkYXRlcmFuZ2UobWlkKzEsZSxsLHIsdmFsLDIqaW5kZXgrMSk7CiAgICBtYXh0cmVlW2luZGV4XT1tYXgobWF4dHJlZVsyKmluZGV4XSxtYXh0cmVlWzIqaW5kZXgrMV0pOwogICAgbWludHJlZVtpbmRleF09bWluKG1pbnRyZWVbMippbmRleF0sbWludHJlZVsyKmluZGV4KzFdKTsKICAgIHJldHVybiA7Cn0KCmludCBxdWVyeW1heChpbnQgcyxpbnQgZSxpbnQgbCxpbnQgcixpbnQgaW5kZXgpCnsKICAgIGxhenlwcm9wKGluZGV4LHMsZSk7CgogICAgaWYoZTxsIG9yIHM+ciBvciBzPmUpICAgIC8vIG1pc3NlZCBzPmUgY2FzZQogICAgewogICAgICAgIHJldHVybiAtaW5mOyAgLy8gb3V0IG9mIHJhbmdlCiAgICB9CgogICAgaWYocz49bCBhbmQgZTw9cikKICAgIHsKICAgICAgICByZXR1cm4gbWF4dHJlZVtpbmRleF07CiAgICB9CgogICAgaW50IG1pZD0ocytlKT4+MTsKCiAgICBpbnQgbGFucz1xdWVyeW1heChzLG1pZCxsLHIsMippbmRleCk7CiAgICBpbnQgcmFucz1xdWVyeW1heChtaWQrMSxlLGwsciwyKmluZGV4KzEpOwoKICAgIHJldHVybiBtYXgobGFucyxyYW5zKTsKfQoKaW50IHF1ZXJ5bWluKGludCBzLGludCBlLGludCBsLGludCByLGludCBpbmRleCkKewogICAgbGF6eXByb3AoaW5kZXgscyxlKTsKCiAgICBpZihlPGwgb3Igcz5yIG9yIHM+ZSkgICAgIC8vIG1pc3NlZCBzPmUgY2FzZQogICAgewogICAgICAgIHJldHVybiAraW5mOyAgLy8gb3V0IG9mIHJhbmdlCiAgICB9CgogICAgaWYocz49bCBhbmQgZTw9cikKICAgIHsKICAgICAgICByZXR1cm4gbWludHJlZVtpbmRleF07CiAgICB9CgogICAgaW50IG1pZD0ocytlKT4+MTsKCiAgICBpbnQgbGFucz1xdWVyeW1pbihzLG1pZCxsLHIsMippbmRleCk7CiAgICBpbnQgcmFucz1xdWVyeW1pbihtaWQrMSxlLGwsciwyKmluZGV4KzEpOwoKICAgIHJldHVybiBtaW4obGFucyxyYW5zKTsKfQoKaW50IG1haW4oKQp7CiAgICBCT09TVAoKICAgIGludCB0OwogICAgY2luPj50OwoKICAgIHdoaWxlKHQtLSkKICAgIHsKCiAgaW50IG4scTsKICBjaW4+Pm4+PnE7CgogIGludCBhW24rMV09ezB9OwoKICBSRVAoaSwxLG4rMSwxKQogIHsKICAgICAgaW50IGFbaV07CiAgICAgIGNpbj4+YVtpXTsKICAgICAgY1tpXT1jW2ktMV0rYVtpXTsKICAgICAgY291dDw8aTw8IiAiPDxjW2ldPDxlbmRsOwogIH0KCiAgYnVpbGQoMSxuLDEpOwoKICB3aGlsZShxLS0pCiAgewogICAgICBjaGFyIGM7CiAgICAgIGNpbj4+YzsKICAgICAgaWYoYz09J1EnKQogICAgICB7CiAgICAgICAgICBpbnQgbCxyOwogICAgICAgICAgY2luPj5sPj5yOwoKICAgICAgICAgICAgaW50IGNyPXF1ZXJ5bWF4KDEsbixyLG4sMSk7CiAgICAgICAgICAgIGludCBjbD1xdWVyeW1pbigxLG4sMSxsLTEsMSk7CiAgICAgICAgICAgLy8gY291dDw8Y3I8PCIgIjw8Y2w8PCIgYW5zPSAiOwogICAgICAgICAgICBpbnQgYW5zPWNyLWNsOwogICAgICAgICAgICBjb3V0PDwiYW5zPSI7CiAgICAgICAgICAgIGNvdXQ8PGFuczw8ZW5kbDsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKICAgICAgICAgICAgaW50IHgsdjsKICAgICAgICAgICAgY2luPj54Pj52OwogICAgICAgICAgICB1cGRhdGVyYW5nZSgxLG4seCxuLHgtYVt4XSwxKTsgLy8gbWFkZSBtaXN0YWtlIGluIHJhbmdlIHRvIGJlIHVwZGF0ZWQgICAvLyBtYWRlIG1pc3Rha2UgaW4gdXBkYXRlIHZhbHVlICwgd3JvdGUganVzdCB4IHRoZXJlCiAgICAgICAgICAgIGFbeF09djsKICAgICAgfQogIH0KCiAgICB9Cn0KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwo=