jqsh @ 2022-01-22 11:02:41
#include<bits/stdc++.h>
using namespace std;
long long n,a,q;
long long dis[8000001],m[8000001][2],ad[8000001][2];
long long read(){
long long k=0,k1=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') k1=-1;
ch=getchar();
}
while(isdigit(ch)){
k=(k<<1)+(k<<3)+(ch^48);
ch=getchar();
}
return k*k1;
}
void upd(long long k,long long x,long long y){
long long mid=(x+y)/2;
if(m[k][1]){
m[k<<1][1]=1;m[k<<1][0]=m[k][0];
m[k<<1|1][1]=1;m[k<<1|1][0]=m[k][0];
dis[k]=m[k][0];
m[k][0]=m[k][1]=0;
ad[k][0]=ad[k][1]=0;
ad[k<<1][0]=0;ad[k<<1][1]=-1;
ad[k<<1|1][0]=0;ad[k<<1|1][1]=-1;
return;
}
if(ad[k][1]==1){
ad[k<<1][0]+=ad[k][0];
ad[k<<1|1][0]+=ad[k][0];
ad[k<<1][1]=ad[k<<1|1][1]=1;
dis[k]+=ad[k][0];
ad[k][0]=ad[k][1]=0;
}
else if(ad[k][1]==-1){
ad[k<<1][1]=ad[k<<1|1][1]=-1;
ad[k][0]=ad[k][1]=0;
}
return;
}
void adb(long long k,long long x,long long y,long long s,long long e){
if(x>e||y<e) return;
if(x==y&&x==e){
dis[k]=s;
return;
}
long long mid=(x+y)/2;
adb(k<<1,x,mid,s,e);
adb(k<<1|1,mid+1,y,s,e);
dis[k]=max(dis[k<<1],dis[k<<1|1]);
return;
}
void adm(long long k,long long x,long long y,long long l,long long r,long long s){
upd(k,x,y);
if(y<l||x>r) return;
if(x>=l&&y<=r){
m[k][0]=s;m[k][1]=1;
ad[k][0]=0;ad[k][1]=-1;
dis[k]=s;
upd(k,x,y);
return;
}
long long mid=(x+y)/2;
adm(k<<1,x,mid,l,r,s);
adm(k<<1|1,mid+1,y,l,r,s);
dis[k]=max(dis[k<<1],dis[k<<1|1]);
upd(k,x,y);
return;
}
void add(long long k,long long x,long long y,long long l,long long r,long long s){
upd(k,x,y);
if(y<l||x>r) return;
long long mid=(x+y)/2;
if(x>=l&&y<=r){
ad[k<<1][0]+=s;ad[k<<1][1]=1;
ad[k<<1|1][0]+=s;ad[k<<1|1][1]=1;
dis[k]+=s;
upd(k,x,y);
return;
}
add(k<<1,x,mid,l,r,s);
add(k<<1|1,mid+1,y,l,r,s);
dis[k]=max(dis[k<<1],dis[k<<1|1]);
upd(k,x,y);
return;
}
long long find(long long k,long long x,long long y,long long l,long long r){
upd(k,x,y);
if(y<l||x>r) return -0x3f3f3f3f3f;
long long mid=(x+y)/2;
if(x>=l&&y<=r){
return dis[k];
}
return max(find(k<<1|1,mid+1,y,l,r),find(k<<1,x,mid,l,r));
}
int main(){
n=read();q=read();
for(long long i=1;i<=n*4;i++) dis[i]=-0x3f3f3f3f3f;
for(long long i=1;i<=n;i++){
a=read();
adb(1,1,n,a,i);
}
while(q--){
long long op;
op=read();
long long l,r,x;
if(op==1){
l=read();r=read();x=read();
if(l>r) swap(l,r);
adm(1,1,n,l,r,x);
}
if(op==2){
l=read();r=read();x=read();
if(l>r) swap(l,r);
add(1,1,n,l,r,x);
}
if(op==3){
l=read();r=read();
if(l>r) swap(l,r);
printf("%lld\n",find(1,1,n,l,r));
}
}
return 0;
}
by Elgo87 @ 2022-01-22 11:13:28
@jqsh 这缩进太……太有特色了 /ll
by x0d5_n14R @ 2022-01-22 11:22:47
估计和我之前一样下传标记假了,可以再查一查。
by jqsh @ 2022-01-26 12:52:03
@Elgo87 本来还行,但粘贴上去后就变成了怪怪的样子
by jqsh @ 2022-01-26 12:55:43
#include<bits/stdc++.h>
using namespace std;
long long n,a,q;
long long dis[8000001],m[8000001][2],ad[8000001][2];
long long read(){
long long k=0,k1=1;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') k1=-1;
ch=getchar();
}
while(isdigit(ch)){
k=(k<<1)+(k<<3)+(ch^48);
ch=getchar();
}
return k*k1;
}
void upd(long long k,long long x,long long y){
long long mid=(x+y)/2;
if(m[k][1]){
m[k<<1][1]=1;m[k<<1][0]=m[k][0];
m[k<<1|1][1]=1;m[k<<1|1][0]=m[k][0];
dis[k]=m[k][0];
m[k][0]=m[k][1]=0;
ad[k][0]=0;ad[k][1]=-1;
return;
}
if(ad[k][1]==1){
ad[k<<1][0]+=ad[k][0];
ad[k<<1|1][0]+=ad[k][0];
ad[k<<1][1]=ad[k<<1|1][1]=1;
dis[k]+=ad[k][0];
ad[k][0]=ad[k][1]=0;
}
else if(ad[k][1]==-1){
ad[k<<1][1]=ad[k<<1|1][1]=-1;
ad[k][0]=ad[k][1]=0;
}
return;
}
void adb(long long k,long long x,long long y,long long s,long long e){
if(x>e||y<e) return;
if(x==y&&x==e){
dis[k]=s;
return;
}
long long mid=(x+y)/2;
adb(k<<1,x,mid,s,e);
adb(k<<1|1,mid+1,y,s,e);
dis[k]=max(dis[k<<1],dis[k<<1|1]);
return;
}
void adm(long long k,long long x,long long y,long long l,long long r,long long s){
upd(k,x,y);
if(y<l||x>r) return;
if(x>=l&&y<=r){
m[k][0]=s;m[k][1]=1;
ad[k][0]=0;ad[k][1]=-1;
dis[k]=s;
upd(k,x,y);
return;
}
long long mid=(x+y)/2;
adm(k<<1,x,mid,l,r,s);
adm(k<<1|1,mid+1,y,l,r,s);
dis[k]=max(dis[k<<1],dis[k<<1|1]);
upd(k,x,y);
return;
}
void add(long long k,long long x,long long y,long long l,long long r,long long s){
upd(k,x,y);
if(y<l||x>r) return;
long long mid=(x+y)/2;
if(x>=l&&y<=r){
ad[k<<1][0]+=s;ad[k<<1][1]=1;
ad[k<<1|1][0]+=s;ad[k<<1|1][1]=1;
dis[k]+=s;
upd(k,x,y);
return;
}
add(k<<1,x,mid,l,r,s);
add(k<<1|1,mid+1,y,l,r,s);
dis[k]=max(dis[k<<1],dis[k<<1|1]);
upd(k,x,y);
return;
}
long long find(long long k,long long x,long long y,long long l,long long r){
upd(k,x,y);
if(y<l||x>r) return -0x3f3f3f3f3f;
long long mid=(x+y)/2;
if(x>=l&&y<=r){
return dis[k];
}
return max(find(k<<1|1,mid+1,y,l,r),find(k<<1,x,mid,l,r));
}
int main(){
n=read();q=read();
for(long long i=1;i<=n*4;i++) dis[i]=-0x3f3f3f3f3f;
for(long long i=1;i<=n;i++){
a=read();
adb(1,1,n,a,i);
}
while(q--){
long long op;
op=read();
long long l,r,x;
if(op==1){
l=read();r=read();x=read();
if(l>r) swap(l,r);
adm(1,1,n,l,r,x);
}
if(op==2){
l=read();r=read();x=read();
if(l>r) swap(l,r);
add(1,1,n,l,r,x);
}
if(op==3){
l=read();r=read();
if(l>r) swap(l,r);
printf("%lld\n",find(1,1,n,l,r));
}
}
return 0;
}
by jqsh @ 2022-01-26 12:56:14
@jqsh emmm...突然好了...