比赛 |
树形数据结构拔高 |
评测结果 |
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;
}