萌新求助线段树
  • 板块学术版
  • 楼主_FJqwq
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/1/11 16:15
  • 上次更新2023/10/24 04:44:09
查看原帖
萌新求助线段树
755947
_FJqwq楼主2023/1/11 16:15

救救孩子吧,this

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5;
ll t,n,q,c;
struct node{
	ll sum,plue,tag;
	bool flag;
}tree[N<<2];
#define ls k<<1,l,mid
#define rs k<<1|1,mid+1,r
void pushdown(int k){
	if(tree[k].flag){
		tree[k<<1].sum=tree[k<<1|1].sum=tree[k].tag;
		tree[k<<1].tag=tree[k<<1|1].tag=tree[k].tag;
		tree[k<<1].plue=tree[k<<1|1].plue=0;
		tree[k<<1].flag=tree[k<<1|1].flag=1;
		tree[k].flag=0,tree[k].tag=0;
	}
	if(tree[k].plue){
		tree[k<<1].sum+=tree[k].plue,tree[k<<1|1].sum+=tree[k].plue;
		tree[k<<1].plue+=tree[k].plue,tree[k<<1|1].plue+=tree[k].plue;
		tree[k].plue=0;
	}
}
void change1(int k,int l,int r,int x,int y,ll d){
	pushdown(k);
	if(x<=l&&r<=y){
		tree[k].sum+=d;
		tree[k].plue+=d;
		return ;
	}
	int mid=(l+r)>>1;
	if(x<=mid)
		change1(ls,x,y,d);
	if(mid<y)
		change1(rs,x,y,d);
	return ;
}
void change2(int k,int l,int r,int x,int y,ll d){
	pushdown(k);
	if(x<=l&&r<=y){
		tree[k].sum=d;
		tree[k].flag=1;
		tree[k].plue=0;
		tree[k].tag=d;
		return ;
	}
	int mid=(l+r)>>1;
	if(x<=mid)
		change1(ls,x,y,d);
	if(mid<y)
		change1(rs,x,y,d);
	return ;
}
ll query(int k,int l,int r,int x){
	if(l==r)
		return tree[k].sum;
	int mid=(l+r)>>1;
	pushdown(k);
	if(x<=mid)
		return query(ls,x);
	else
		return query(rs,x);
}
int main(){
	cin>>t;
	ll x,y,z,l;
	char op[15];
	for(int i=1;i<=t;i++){
		printf("Case #%d\n",i);
		scanf("%lld%lld%lld",&n,&q,&c);
		change2(1,1,n,1,n,c);
		while(q--){
			scanf("%s",op+1);
			l=strlen(op+1);
			if(l==3){
				scanf("%lld%lld%lld",&x,&y,&z);
				change1(1,1,n,x,y,z);
			}
			else
				if(l==5&&op[1]=='m'){
					scanf("%lld%lld%lld",&x,&y,&z);
					change1(1,1,n,x,y,-z);
				}
				else
					if(l==5&&op[1]=='a'){
						scanf("%lld%lld",&x,&y);
						change1(1,1,n,x,x,y);
					}
					else
						if(l==7){
							scanf("%lld%lld",&x,&y);
							change1(1,1,n,x,x,-y);
						}
						else
							if(l==5){
								scanf("%lld%lld",&x,&y);
								change2(1,1,n,x,x,y);
							}
							else{
								scanf("%lld",&x);
								printf("%lld\n",query(1,1,n,x));
							}
		}
		for(int i=0;i<=(N<<2);i++)
			tree[i].sum=tree[i].plue=tree[i].tag=tree[i].flag=0;;
		puts("");
	}
	return 0;
}

WA 惹

2023/1/11 16:15
加载中...