比赛 树形数据结构拔高 评测结果 AAAAAAAAAA
题目名称 聪聪的世界 最终得分 100
用户昵称 会挽弯弓满月 运行时间 7.079 s
代码语言 C++ 内存使用 67.01 MiB
提交时间 2025-04-17 20:50:53
显示代码纯文本
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e6+10;
ll read(){
	ll x=0,f=1;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9'){
		x=x*10+c-'0';
		c=getchar();
	}
	return f*x;
}
ll n,m;
ll a[N];
struct node{
	ll minn,maxn;
	ll tag;
}t[N*4];
void build(ll p,ll l,ll r){
	if(l==r){
		t[p].maxn=a[l];
		t[p].minn=a[l];
		return;
	}
	ll mid=(l+r)>>1;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	t[p].maxn=max(t[p*2].maxn,t[p*2+1].maxn);
	t[p].minn=min(t[p*2].minn,t[p*2+1].minn);
	return;
}
void xc(ll p,ll l,ll r){
	if(t[p].tag==0) return;
	ll mid=(l+r)>>1;
	t[p*2].maxn+=t[p].tag;
	t[p*2].minn+=t[p].tag;
	t[p*2+1].maxn+=t[p].tag;
	t[p*2+1].minn+=t[p].tag;
	t[p*2].tag+=t[p].tag;
	t[p*2+1].tag+=t[p].tag;
	t[p].tag=0;
}
void update(ll p,ll l,ll r,ll l1,ll r1,ll d){
	if(l==l1&&r==r1){
		t[p].maxn+=d;
		t[p].minn+=d;
		t[p].tag+=d;
		return;
	}
	xc(p,l,r);
	ll mid=(l+r)>>1;
	if(r1<=mid) update(p*2,l,mid,l1,r1,d);
	else if(l1>mid) update(p*2+1,mid+1,r,l1,r1,d);
	else{
		update(p*2,l,mid,l1,mid,d);
		update(p*2+1,mid+1,r,mid+1,r1,d);
	}
	t[p].maxn=max(t[p*2].maxn,t[p*2+1].maxn);
	t[p].minn=min(t[p*2].minn,t[p*2+1].minn);
	return;
}
void insert(ll p,ll l,ll r,ll k,ll d){
	if(l==r){
		t[p].maxn=d;
		t[p].minn=d;
		return;
	}
	ll mid=(l+r)>>1;
	if(k<=mid) insert(p*2,l,mid,k,d);
	else insert(p*2+1,mid+1,r,k,d);
	t[p].maxn=max(t[p*2].maxn,t[p*2+1].maxn);
	t[p].minn=min(t[p*2].minn,t[p*2+1].minn);
	return;
}
ll getz(ll p,ll l,ll r,ll x){
	if(l==r) return t[p].minn;
	xc(p,l,r);
	ll mid=(l+r)>>1;
	if(x<=mid) return getz(p*2,l,mid,x);
	else return getz(p*2+1,mid+1,r,x);
}
ll left_min(ll p,ll l,ll r,ll l1,ll r1,ll x){
	if(l>r1||r<l1) return -1;
	if(t[p].minn>=x) return -1;
	xc(p,l,r);
	if(l==r) return t[p].minn;
	ll mid=(l+r)>>1;
	ll res=left_min(p*2+1,mid+1,r,l1,r1,x);
	if(res!=-1) return res;
	return left_min(p*2,l,mid,l1,r1,x);
}
ll left_max(ll p,ll l,ll r,ll l1,ll r1,ll x){
	if(l>r1||r<l1) return -1;
	if(t[p].maxn<=x) return -1;
	xc(p,l,r);
	if(l==r) return t[p].maxn;
	ll mid=(l+r)>>1;
	ll res=left_max(p*2+1,mid+1,r,l1,r1,x);
	if(res!=-1) return res;
	return left_max(p*2,l,mid,l1,r1,x);
}
ll right_min(ll p,ll l,ll r,ll l1,ll r1,ll x){
	if(l>r1||r<l1) return -1;
	if(t[p].minn>=x) return -1;
	xc(p,l,r);
	if(l==r) return t[p].minn;
	ll mid=(l+r)>>1;
	ll res=right_min(p*2,l,mid,l1,r1,x);
	if(res!=-1) return res;
	return right_min(p*2+1,mid+1,r,l1,r1,x);
}ll right_max(ll p,ll l,ll r,ll l1,ll r1,ll x){
	if(l>r1||r<l1) return -1;
	if(t[p].maxn<=x) return -1;
	xc(p,l,r);
	if(l==r) return t[p].maxn;
	ll mid=(l+r)>>1;
	ll res=right_max(p*2,l,mid,l1,r1,x);
	if(res!=-1) return res;
	return right_max(p*2+1,mid+1,r,l1,r1,x);
}
int main(){
	freopen("ccsworld.in","r",stdin);
	freopen("ccsworld.out","w",stdout);
	n=read();m=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	build(1,1,n);
	ll opt,x,y,w,t,ans;
	for(int i=1;i<=m;i++){
		opt=read();
		if(opt==1){
			x=read();
			t=getz(1,1,n,x);
			ans=left_min(1,1,n,1,x-1,t);
			printf("%lld\n",ans);
		}
		else if(opt==2){
			x=read();
			t=getz(1,1,n,x);
			ans=left_max(1,1,n,1,x-1,t);
			printf("%lld\n",ans);
		}
		else if(opt==3){
			x=read();
			t=getz(1,1,n,x);
			ans=right_min(1,1,n,x+1,n,t);
			printf("%lld\n",ans);
		}
		else if(opt==4){
			x=read();
			t=getz(1,1,n,x);
			ans=right_max(1,1,n,x+1,n,t);
			printf("%lld\n",ans);
		}
		else if(opt==5){
			x=read();y=read();
			ll p,q;
			p=getz(1,1,n,x);q=getz(1,1,n,y);
			insert(1,1,n,x,q);
			insert(1,1,n,y,p);
		}
		else if(opt==6){
			x=read();y=read();w=read();
			update(1,1,n,x,y,w);
		}
		else if(opt==7){
			x=read();y=read();w=read();
			update(1,1,n,x,y,-w);
		}
	}
	return 0;
}