题意就不发了,怕出锅
用来当成set的经典应用吧
#include<cstdio>
#include<cstdlib>
#include<set>
using namespace std;
int M;
long long C,Ans;
struct Node{
int l,r,v;
bool operator<(const Node &a)const{
return l<a.l;
}
}X[200005];
set<Node> S;
set<Node>::iterator it,tmp;
int Input(){
int s=0;
char ch;
while(ch=getchar(),ch<'0'||ch>'9');
while(ch>='0'&&ch<='9'){
s=(s<<3)+(s<<1)+ch-'0';
ch=getchar();
}
return s;
}
int main(){
int l,r,v,x,now=0;
Node u,a,b,c;
char opt[15];
scanf("%d%lld",&M,&C);
while(M--){
scanf("%s",opt);
if(*opt=='c'){
l=Input(),r=Input(),v=Input();
r-=(r-l)%v,u=(Node){l,r,v};
it=S.lower_bound(u);
if(it!=S.begin()){
tmp=it,tmp--;
if((*tmp).r>r){
c=a=b=*tmp;
a.r=l-1,a.r-=(a.r-a.l)%a.v;
b.l=r+1,b.l+=(b.r-b.l)%b.v;
S.erase(c),S.insert(a),S.insert(b);
}
}
S.insert(u);
}
else if(*opt=='d'){
l=Input(),r=Input();
u=(Node){l,r,0};
it=S.lower_bound(u);
if(it!=S.begin()){
tmp=it,tmp--;
if((*tmp).r>=l){
a=b=*tmp,S.erase(a);
a.r=l-1,a.r-=(a.r-a.l)%a.v;
S.insert(a);
if(b.r>r){
b.l=r+1,b.l+=(b.r-b.l)%b.v;
S.insert(b);
continue;
}
}
}
it=S.lower_bound(u);
while(it!=S.end()&&(*it).r<=r)
X[++now]=*it,*it++;
while(now)
S.erase(X[now--]);
if(it!=S.end()&&(*it).l<=r){
a=*it,S.erase(a);
a.l=r+1,a.l+=(a.r-a.l)%a.v;
S.insert(a);
}
}
else{
x=Input(),u=(Node){x,x,0};
Ans=1<<30;
it=S.lower_bound(u);
if(it!=S.end())
Ans=(*it).l-x;
if(it!=S.begin()){
it--,u=*it;
if(u.r>=x){
v=abs(u.l%u.v-x%u.v);
Ans=min(Ans,1ll*min(v,u.v-v));
}
else Ans=min(Ans,1ll*(x-u.r));
}
printf("%lld\n",max(0ll,C-Ans*Ans));
}
}
return 0;
}