珂朵莉树求调
查看原帖
珂朵莉树求调
1050021
likezheng2023楼主2024/5/19 21:03
#include<bits/stdc++.h>
using namespace std;
#define sit set<Node>::iterator
const int MAXN=1e5+10;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-48;ch=getchar();}return x*f;}
struct Node{
	int l,r;
	mutable int val,vala,valb;
	bool operator <(const Node& a)const{
		return l<a.l;
	}
};
set<Node> odtp,odtm;
int n,m,from,a[MAXN],b[MAXN],pl[MAXN],mul[MAXN];
sit splitp(int pos){
	sit it=odtp.lower_bound({pos,0,0,0,0});
	if (it!=odtp.end()&&it->l==pos) return it;
	--it;
	int l=it->l,r=it->r;
	int val=it->val,vala=it->vala,valb=it->valb;
	odtp.erase(it);
	odtp.insert({l,pos-1,val,vala,valb});
	return odtp.insert({pos,r,val,vala,valb}).first;
}
sit splitm(int pos){
	sit it=odtm.lower_bound({pos,0,0,0,0});
	if (it!=odtm.end()&&it->l==pos) return it;
	--it;
	int l=it->l,r=it->r;
	int val=it->val,vala=it->vala,valb=it->valb;
	odtm.erase(it);
	odtm.insert({l,pos-1,val,vala,valb});
	return odtm.insert({pos,r,val,vala,valb}).first;
}
void assignp(int l,int r,int val,int vala,int valb){
	sit it2=splitp(r+1),it1=splitp(l);
	odtp.erase(it1,it2);
	odtp.insert({l,r,val,vala,valb});
	return;
}
void assignm(int l,int r,int val,int vala,int valb){
	sit it2=splitm(r+1),it1=splitm(l);
	odtm.erase(it1,it2);
	odtm.insert({l,r,val,vala,valb});
	return;
}
signed main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++) a[i]=read();
	for(int i=1;i<=n;i++) b[i]=read(),pl[i]=a[i]+b[i],mul[i]=a[i]*b[i];
	for(int i=1;i<=n+1;i++) if(pl[i]!=pl[i-1]){
		if(from==0) from=i;
		else odtp.insert({from,i-1,pl[i-1],a[i-1],b[i-1]}),from=0;
	}
	for(int i=1;i<=n+1;i++) if(mul[i]!=mul[i-1]){
		if(from==0) from=i;
		else odtm.insert({from,i-1,mul[i-1],a[i-1],b[i-1]}),from=0;
	}
	while(m--){
		int op=read();
		if(op==1){
			int l=read(),r=read(),k=read(),t=read();
			for(Node i: odtm) if(i.val<=k){
				i.val=(i.vala+t)*(i.valb+t);
				i.vala+=t,i.valb+=t;
				sit lft=splitm(i.l);
				lft->val+=2*t;
				lft->vala+=t;
				lft->valb+=t;
				sit rig=splitm(i.r+1);
				rig--;
				rig->val+=2*t;
				rig->vala+=t;
				rig->valb+=t;
			}
		}else if(op==2){
			int pos=read(),x=read(),y=read();
			assignp(pos,pos,x+y,x,y);
			assignm(pos,pos,x*y,x,y);
		}else{
			int l=read(),r=read(),cnt=0;
			sit lft=splitp(l);
			sit rig=splitp(r+1);
			for(sit i=lft;i!=rig;i++)
				cnt+=i->val*(i->r-i->l+1);
			cout<<cnt<<'\n';
		}
	}return 0;
}

2024/5/19 21:03
加载中...