#pragma once
template<classMonoid>structTreap{usingT=typenameMonoid::value_type;structNode{intl,r,sz,prio;boolrev;Tval,sum,revsum;};vector<Node>t;Treap(intn=0){t.reserve(n+1);t.push_back(Node{0,0,0,0,false,Monoid::unit(),Monoid::unit(),Monoid::unit()});}intnew_node(constT&v){t.push_back(Node{0,0,1,rng(),false,v,v,v});returnSZ(t)-1;}intsize(intx){returnt[x].sz;}Tsum(intx){returnt[x].sum;}voidpull(intx){Node&v=t[x];v.sz=t[v.l].sz+1+t[v.r].sz;v.sum=Monoid::op(Monoid::op(t[v.l].sum,v.val),t[v.r].sum);v.revsum=Monoid::op(Monoid::op(t[v.r].revsum,v.val),t[v.l].revsum);}voidtoggle(intx){if(!x)return;swap(t[x].l,t[x].r);swap(t[x].sum,t[x].revsum);t[x].rev^=1;}voidpush(intx){if(t[x].rev){toggle(t[x].l);toggle(t[x].r);t[x].rev=false;}}intbuild(constvector<T>&a){vector<int>st;for(auto&v:a){intx=new_node(v),last=0;while(!st.empty()&&t[st.back()].prio<t[x].prio){last=st.back();pull(last);st.pop_back();}t[x].l=last;if(!st.empty())t[st.back()].r=x;st.push_back(x);}for(inti=SZ(st)-1;i>=0;i--)pull(st[i]);returnst.empty()?0:st[0];}intmerge(inta,intb){if(!a||!b)returna|b;if(t[a].prio>t[b].prio){push(a);t[a].r=merge(t[a].r,b);pull(a);returna;}else{push(b);t[b].l=merge(a,t[b].l);pull(b);returnb;}}pair<int,int>split(intx,intk){if(!x)return{0,0};push(x);intls=t[t[x].l].sz;if(k<=ls){auto[a,b]=split(t[x].l,k);t[x].l=b;pull(x);return{a,x};}else{auto[a,b]=split(t[x].r,k-ls-1);t[x].r=a;pull(x);return{x,b};}}Tquery(int&x,intl,intr){if(l>r)returnMonoid::unit();auto[a,b]=split(x,l);auto[c,d]=split(b,r-l+1);Tres=sum(c);x=merge(a,merge(c,d));returnres;}voidreverse(int&x,intl,intr){if(l>=r)return;auto[a,b]=split(x,l);auto[c,d]=split(b,r-l+1);toggle(c);x=merge(a,merge(c,d));}Tget(int&x,intk){auto[a,b]=split(x,k);auto[c,d]=split(b,1);Tres=t[c].val;x=merge(a,merge(c,d));returnres;}voidset(int&x,intk,constT&v){auto[a,b]=split(x,k);auto[c,d]=split(b,1);t[c].val=v;pull(c);x=merge(a,merge(c,d));}voidinsert(int&x,intk,constT&v){auto[a,b]=split(x,k);x=merge(merge(a,new_node(v)),b);}voiderase(int&x,intk){auto[a,b]=split(x,k);auto[c,d]=split(b,1);x=merge(a,d);}};