求hack
查看原帖
求hack
1005693
pengbonan楼主2024/8/14 10:55
#include<bits/stdc++.h>
#define int long long
#define inf LONG_LONG_MAX
#define endl '\n'
#define ls(t) (t<<1)
#define rs(t) (t<<1|1)
using namespace std;
int n,q,x,l,r,w,c,lasl,lasr,lasc,sum,laz[4100010];
char op,lastop;
struct N{
	int mx,mi;
}tr[4100100];
inline int read(){
	int x=1,sum=0;
	char ch;
	ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-'){
			x=-1;
		}
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		sum=(sum<<3)+(sum<<1)+ch-'0';
		ch=getchar();
	}
	return x*sum;
}
inline void pushup(int p){
	tr[p].mx=max(tr[ls(p)].mx,tr[rs(p)].mx);
	tr[p].mi=min(tr[ls(p)].mi,tr[rs(p)].mi);
}
inline void pushdown(int p){
	if(laz[p]!=0){
		laz[ls(p)]+=laz[p];
		laz[rs(p)]+=laz[p];
		tr[ls(p)].mx+=laz[p];
		tr[rs(p)].mx+=laz[p];
		tr[ls(p)].mi+=laz[p];
		tr[rs(p)].mi+=laz[p];
		laz[p]=0;
	}
}
inline void update(int pl,int pr,int l,int r,int w,int p){
	if(l<=pl&&pr<=r){
		tr[p].mx+=w;
		tr[p].mi+=w;
		laz[p]+=w;
		return;
	}
	pushdown(p);
	int mid=pl+pr>>1;
	if(l<=mid)update(pl,mid,l,r,w,ls(p));
	if(r>mid)update(mid+1,pr,l,r,w,rs(p));
	pushup(p);
}
inline int query(int pl,int pr,int l,int r,int c,int p){
	if(l<=pl&&pr<=r){
		if(c<=tr[p].mi){
			return (pr-pl+1);
		}
		if(c>tr[p].mx){
			return 0;
		}
	}
	pushdown(p);
	int mid=pl+pr>>1,ans=0;
	if(l<=mid)ans+=query(pl,mid,l,r,c,ls(p));
	if(r>mid)ans+=query(mid+1,pr,l,r,c,rs(p));
	pushup(p);
	return ans;
}
inline void build(int l,int r,int p){
	if(l==r){
		x=read();
		tr[p].mx=x;
		tr[p].mi=x;
		return ;
	}
	int mid=l+r>>1;
	build(l,mid,ls(p));
	build(mid+1,r,rs(p));
	pushup(p);
}
signed main(){
	n=read();
	q=read();
	build(1,n,1);
	for(int i=1;i<=q;i++){
		cin>>op;
		l=read();
		r=read();
		w=read();
		if(lastop==op&&op=='A'&&lasl==l&&lasr==r&&lasc==w){
			cout<<sum<<endl;
			continue;
		}
		if(op=='M'){
			update(1,n,l,r,w,1);
		}else{
			sum=query(1,n,l,r,w,1);
			cout<<sum<<endl;
		}
		lastop=op;
		lasl=l;
		lasr=r;
		lasc=w;
	}
	return 0;
}

同学用线段树乱搞过了,求hack

2024/8/14 10:55
加载中...