90pts,寄了求调
查看原帖
90pts,寄了求调
389348
TuYaBoYu楼主2024/6/25 15:23
#include<bits/stdc++.h> 

#define ls(id) ((id)<<1)
#define rs(id) (((id)<<1)|1)
#define mid (((l)+(r))>>1)
#define ll long long
#define none -1e18
#define enter putchar('\n')
#define space putchar(' ')
using namespace std;
const int maxn = 1e6+7;
#define int ll

template<typename T>void read(T& n)
{
    T f=1,k=0;char c=getchar();
    while(c>'9'||c<'0'){if(c=='-'){f=-1;}c=getchar();}
    while(c<='9'&&c>='0'){k=(k<<3)+(k<<1)+c-'0';c=getchar();}
    n=f*k;
}

template<typename T>void write(T x)
{
    if(x==0){putchar('0');return;}
    if(x<0)putchar('-'),x=-x;
    if(x>9)write(x/10);
    putchar(x%10+'0');
}

ll arr[maxn<<1],tree[maxn<<2],lazy[maxn<<2],lazy2[maxn<<2];

void build(int id,int l,int r) {
	lazy2[id]=none;
	if(l==r) {
		tree[id]=arr[l];
		return;
	}
	build(ls(id),l,mid);
	build(rs(id),mid+1,r);
	tree[id]=max(tree[ls(id)],tree[rs(id)]);
	return;
}

void ad(int id,ll k,int l,int r) {
	tree[id]+=k;
	lazy[id]+=k;
	return;
}

void ch(int id,ll k,int l,int r) {
	tree[id]=k;
	lazy2[id]=k;
	lazy[id]=0;
	return;
}

void push_down(int id,int l,int r) {
	if(lazy2[id]!=none) {
		ch(ls(id),lazy2[id],l,mid);
		ch(rs(id),lazy2[id],mid+1,r);
	}
	if(lazy[id]) {
		ad(ls(id),lazy[id],l,mid);
		ad(rs(id),lazy[id],mid+1,r);
	}
	lazy2[id]=none;
	lazy[id]=0;
	return;
}
void add(int id,ll k,int l,int r,int dl,int dr) {
	if(dl<=l&&dr>=r) {
		ad(id,k,l,r);
		return;
	}
	push_down(id,l,r);
	if(dl<=mid)
		add(ls(id),k,l,mid,dl,dr);
	if(dr>mid)
		add(rs(id),k,mid+1,r,dl,dr);
	tree[id]=max(tree[ls(id)],tree[rs(id)]);
	return;
}

void change(int id,ll k,int l,int r,int dl,int dr) {
	if(dl<=l&&dr>=r) {
		ch(id,k,l,r);
		return;
	}
	push_down(id,l,r);
	if(dl<=mid)
		change(ls(id),k,l,mid,dl,dr);
	if(dr>mid)
		change(rs(id),k,mid+1,r,dl,dr);
	tree[id]=max(tree[ls(id)],tree[rs(id)]);
	return;
}

ll check(int id,int l,int r,int x,int y) {
	push_down(id,l,r);
	if(l>=x&&r<=y) {
		return tree[id];
	}
	int ans=-1e18;
	if(x<=mid)
		ans=max(ans,check(ls(id),l,mid,x,y));
	if(y>mid)
		ans=max(ans,check(rs(id),mid+1,r,x,y));
	return ans;
}

int cnt;
int n,m,k,id;

signed main() {
	read(n);read(m);
	int com,l,r,k;
	for(int i=1;i<=n;++i)
		read(arr[i]);
	build(1,1,n);
	for(int i=1;i<=m;++i) {
		read(com);read(l);read(r);
		if(com==2){
			read(k);
			add(1,k,1,n,l,r);
		}
		else if(com==1){
			read(k);
			change(1,k,1,n,l,r);
		}
		else {
			write(check(1,1,n,l,r)),enter;
		}
	}
	return 0;
}
2024/6/25 15:23
加载中...