inline IT split(int pos){
IT it=s.lower_bound(node(pos));
if(it!=s.end()&&it->l==pos)return it;
--it;
int l=it->l,r=it->r;ll val=it->val;
s.erase(it);
s.insert(node(l,pos-1,val));
return s.insert(node(pos,r,val)).first;
}
inline void assign(int l,int r,int val){//将[l,r]赋值为val
IT itr=split(r+1),itl=split(l);
s.erase(itl,itr);
s.insert(node(l,r,val));
}
inline void add(int l,int r,int val){
IT itr=split(r+1),itl=split(l);
for(;itl!=itr;++itl)itl->val+=val;
return;
}
inline ll kth(int l,int r,int k){
vector<pair<int,int> >q;
IT itr=split(r+1),itl=split(l);
for(;itl!=itr;++itl)
q.push_back(pair<int,int>(itl->val,itl->r-itl->l+1));
sort(q.begin(),q.end());
for(vector<pair<int,int> >::iterator it=q.begin();it!=q.end();++it){
k-=it->second;
if(k<=0)return it->first;
}
}
inline int ask1(int l,int r,int val){
int ans=0;
IT itr=split(r+1),itl=split(l);
for(;itl!=itr;++itl)
if(itl->val==val)ans+=(itl->r-itl->l+1);
return ans;
}
inline int ask2(int l,int r,int val){
int ans=0,cnt=0;
IT itr=split(r+1),itl=split(l);
for(;itl!=itr;++itl){
if(itl->val!=val)ans=max(ans,cnt),cnt=0;
else cnt+=itl->r-itl->l+1;
}
return max(ans,cnt);
}
void get_sort(int l,int r){
memset(sum,0,sizeof(sum));
IT itr=split(r+1),itl=split(l),it=itl;
for(;it!=itr;++it)sum[it->val]+=it->r-it->l+1;
s.erase(itl,itr);
for(int i=1;i<=26;++i)
if(sum[i]){
s.insert(node(l,l+sum[i]-1,i));
l+=sum[i];
}
}
原文:https://www.cnblogs.com/PPXppx/p/11336454.html