25pts求助
查看原帖
25pts求助
817681
HZHDCM楼主2024/6/1 14:45
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
struct Tree{
	int l,r;
	int max,wmax,pre,add;
}t[N<<2];
int n,m,a[N],ans,cnt;
void push_up(int p){
	t[p].pre=t[p<<1].pre+t[p<<1|1].pre;
	t[p].max=max(t[p<<1].max,t[p<<1|1].max);
	t[p].wmax=max(t[p<<1].wmax,t[p<<1|1].wmax);
}
void build(int l,int r,int p){
	t[p].l=l;t[p].r=r;
	if(l==r){
		t[p].pre=t[p].max=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(l,mid,p<<1);
	build(mid+1,r,p<<1|1);
	push_up(p);
}
void push_down(int p){
	if(t[p].add){
		t[p<<1].pre+=(t[p<<1].r-t[p<<1].l+1)*t[p].add;
		t[p<<1|1].pre+=(t[p<<1|1].r-t[p<<1|1].l+1)*t[p].add;
		t[p<<1].max+=t[p].add;t[p<<1|1].max+=t[p].add;
		if(t[p<<1].wmax)t[p<<1].wmax+=t[p].add;
		if(t[p<<1|1].wmax)t[p<<1|1].wmax+=t[p].add;
		t[p<<1].add+=t[p].add;t[p<<1|1].add+=t[p].add;
		t[p].add=0;
	}
}
void update(int p,int x,int y){//操作2
	push_down(p);
	if(t[p].l==t[p].r){
		ans=t[p].pre;
		t[p].pre=0;t[p].max=0;
		t[p].wmax=0;
		return ;
	}
	if(t[p].wmax){
		int mid=(t[p].l+t[p].r)>>1;
		if(t[p<<1|1].wmax==t[p].wmax&&y>mid)update(p<<1|1,x,y);
		else if(t[p<<1].wmax==t[p].wmax&&x<=mid)update(p<<1,x,y);
	}
	else{
		int mid=(t[p].l+t[p].r)>>1;
		if(y>mid&&t[p<<1|1].max==t[p].max)update(p<<1|1,x,y);
		else if(x<=mid&&t[p<<1].max==t[p].max)update(p<<1,x,y);
	}
	push_up(p);
}
void update1(int p,int x,int k){//操作1
	push_down(p);
	if(t[p].l==t[p].r){
		t[p].wmax=k-t[p].pre;
		t[p].pre=t[p].wmax;t[p].max=0;
		return ;
	}
	int mid=(t[p].l+t[p].r)>>1;
	if(x>mid)update1(p<<1|1,x,k);
	else update1(p<<1,x,k);
	push_up(p);
}
void update2(int p,int x,int y,int k){
	push_down(p);
	if(x<=t[p].l&&y>=t[p].r){
		t[p].pre+=(t[p].r-t[p].l+1)*k;
		t[p].max+=k;t[p].add+=k;
		if(t[p].wmax)t[p].wmax+=k;
		return ;
	}
	int mid=(t[p].l+t[p].r)>>1;
	if(x<=mid)update2(p<<1,x,y,k);
	if(y>mid)update2(p<<1|1,x,y,k);
	push_up(p);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,n,1);
	while(m--){
		int opt;
		cin>>opt;
		if(opt==1){
			int x,val;
			cin>>x>>val;
			update1(1,x,val);
		}
		if(opt==2){
			int l,r;
			cin>>l>>r;
			update(1,l,r);
			cout<<ans<<endl;
			cnt+=ans;
		}
		if(opt==3){
			int l,r,k;
			cin>>l>>r>>k;
			update2(1,l,r,k);
		}
	}
	if(cnt<10000)cout<<"QAQ";
	else if(cnt<=10000000)cout<<"Sakura";
	else cout<<"ice";
	return 0;
}
2024/6/1 14:45
加载中...