马蜂还彳亍,50pts求助,线段树
查看原帖
马蜂还彳亍,50pts求助,线段树
214728
剑雪清寒楼主2022/4/29 19:26

后五个点全WA,不知道哪挂了

#include <bits/stdc++.h>
#define low -1e11
inline long long read() {
	long long x,f;char ch;
	for(f=0;!isdigit(ch=getchar());f=ch=='-');
	for(x=ch-48;isdigit(ch=getchar());x=x*10+ch-48);
	return f?-x:x;
}
int n=read(),q=read();
long long a[1000001];
struct litree {
	long long sum[2000001],lazy_re[2000001],lazy_ad[2000001];
	int s=0,lson[2000001],rson[2000001];
	inline void lad(int x) {
		if(lazy_re[x]>low) {
			sum[lson[x]]=sum[rson[x]]=lazy_re[lson[x]]=lazy_re[rson[x]]=lazy_re[x];
			lazy_re[x]=low;
			lazy_ad[lson[x]]=lazy_ad[rson[x]]=0;
		}else {
			sum[lson[x]]+=lazy_ad[x];sum[rson[x]]+=lazy_ad[x];
			if(lazy_re[lson[x]]>low) {
				lazy_re[lson[x]]+=lazy_ad[x];
			}else lazy_ad[lson[x]]+=lazy_ad[x];
			if(lazy_re[rson[x]]>low) {
				lazy_re[rson[x]]+=lazy_ad[x];
			}else lazy_ad[rson[x]]+=lazy_ad[x];
			lazy_ad[x]=0;
		}
		return ;
	}
	inline void update(int x) { sum[x]=sum[lson[x]] > sum[rson[x]] ? sum[lson[x]] : sum[rson[x]]; }
	inline void build(int ss,int l,int r) {
		s++;
		lazy_re[ss]=low;
		if(l==r) {
			sum[ss]=a[l];
			return ;
		}
		int mid=(l+r)>>1;
		lson[ss]=s+1;
		build(s+1,l,mid);
		rson[ss]=s+1;
		build(s+1,mid+1,r);
		update(ss);
		return ;
	}
	inline void add(int x,int l,int r,int L,int R,long long ad_s,int job) {
		if(l>R || r<L) return ;
		if(l>=L && r<=R) {
			if(job==1) {
				lazy_re[x]=sum[x]=ad_s;
//				printf("l:%d ;r:%d ;sum:%d\n",l,r,ad_s);
				lazy_ad[x]=0;
			}else {
				if(lazy_re[x]>low) {
					lazy_re[x]+=ad_s;
				}else lazy_ad[x]+=ad_s;
				sum[x]+=ad_s;
			}
			return ;
		}
		lad(x);
		int mid=(l+r)>>1;
		add(lson[x],l,mid,L,R,ad_s,job);
		add(rson[x],mid+1,r,L,R,ad_s,job);
		update(x);
		return ;
	}
	inline long long find(int x,int l,int r,int L,int R) {
		if(l>R || r<L) return low;
		if(l>=L && r<=R) return sum[x];
		lad(x);
		int mid=(l+r)>>1;
		long long a=find(lson[x],l,mid,L,R),b=find(rson[x],mid+1,r,L,R);
		update(x);
		return a>b?a:b;
	}
}tree;
int main() {
	for(int i=1;i<=n;i++) a[i]=read();
	tree.build(1,1,n);
	while(q--) {
		int job=read(),l=read(),r=read();
		if(job!=3) {
			long long k=read();
			tree.add(1,1,n,l,r,k,job);	
		}else printf("%d\n",tree.find(1,1,n,l,r));
	}
	return 0;
}

2022/4/29 19:26
加载中...