玄关求条模版
  • 板块灌水区
  • 楼主hkl99
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/12/28 14:06
  • 上次更新2024/12/28 17:08:06
查看原帖
玄关求条模版
770439
hkl99楼主2024/12/28 14:06

求条模板线段树

题目:

代码:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=3000010;
int n,q,a[N],b[N],cnt;
int op,x,y;
struct treenode {
	int l,r;
	int da,ma,mi;
} t[N*4];
void build(int p,int l,int r) {
	t[p].l=l;
	t[p].r=r;
	if(l==r) {
		t[p].da=a[l];
		t[p].ma=a[l];
		t[p].mi=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(p*2,l,mid);
	build(p*2+1,mid+1,r);
	t[p].da=t[p*2].da+t[p*2+1].da;
	t[p].ma=max(t[p*2].ma,t[p*2+1].ma);
	t[p].mi=min(t[p*2].mi,t[p*2+1].mi);
}
void change(int p,int x,int v) {
	if(t[p].l==t[p].r) {
		t[p].da=v;
		t[p].mi=v;
		t[p].ma=v;
		return;
	}
	int mid=(t[p].l+t[p].r)/2;
	if(x<=mid) {
		change(p*2,x,v);
	} else {
		change(p*2+1,x,v);
	}
	t[p].da=t[p*2].da+t[p*2+1].da;
	t[p].ma=max(t[p*2].ma,t[p*2+1].ma);
	t[p].mi=min(t[p*2].mi,t[p*2+1].mi);
}
int ask(int p,int l,int r,int op) {
	if(l<=t[p].l&&r>=t[p].r) {
		if(op==2) {
			return t[p].da;
		} else if(op==3) {
			return t[p].ma;
		} else {
			return t[p].mi;
		}
	}
	int mid=(t[p].l+t[p].r)/2;
	int val=0;
	if(l<=mid) {
		if(op==2) {
			val+=ask(p*2,l,r,op);
		}
		if(op==3) {
			val=INT_MIN;
			val=max(val,ask(p*2,l,r,op));
		}
		if(op==4) {
			val=(INT_MAX);
			val=min(val,ask(p*2,l,r,op));
		}
	}
	if(r>mid) {
		if(op==2) {
			val+=ask(p*2+1,l,r,op);
		}
		if(op==3) {
			val=INT_MIN;
			val=max(val,ask(p*2+1,l,r,op));
		}
		if(op==4) {
			val=INT_MAX;
			val=min(val,ask(p*2+1,l,r,op));
		}
	}
	return val;
}
signed main() {
	scanf("%lld%lld",&n,&q);
	for(int i=1; i<=n; i++) {
		scanf("%lld",&a[i]);
	}
	build(1,1,n);
	for(int i=1; i<=q; i++) {
		scanf("%lld%lld%lld",&op,&x,&y);
		if(op==1) {
			change(1,x,a[x]+y);
		} else {
			b[++cnt]=ask(1,x,y,op);
		}
	}
	for(int i=1; i<=cnt; i++) {
		printf("%lld\n",b[i]);
	}
	return 0;
}

2024/12/28 14:06
加载中...