直奔主题:求调
查看原帖
直奔主题:求调
1010281
AT_Feild楼主2024/11/19 18:51
#include<bits/stdc++.h>
#define N 10005
#define int long long 
using namespace std;
struct node{
	int l,r,sum,tg=0;
}seg[4*N];
int n,m;
int in[N];
void push_down(int p){
	seg[2*p].tg+=seg[p].tg;
	seg[2*p+1].tg+=seg[p].tg;
	seg[2*p].sum+=(seg[2*p].r-seg[2*p].l+1)*seg[2*p].tg;
	seg[2*p+1].sum+=(seg[2*p+1].r-seg[2*p+1].l+1)*seg[2*p+1].tg;
	seg[p].tg=0;
}
void push_up(int p){
	seg[p].sum=seg[2*p].sum+seg[2*p+1].sum;
}
void building(int p,int l,int r){
	seg[p].l=l;
	seg[p].r=r;
	if(l==r){
		seg[p].sum=in[l];
		return;
	}
	int mid=(l+r)/2;
	building(2*p,l,mid);
	building(2*p+1,mid+1,r);
	push_up(p);
	
}
void insert(int p,int l,int r,int k){
	if(l>seg[p].r or seg[p].l>r)return ;
	if(r>=seg[p].r and seg[p].l>=l){
		seg[p].tg+=k;
		seg[p].sum+=(seg[p].r-seg[p].l+1)*k;
		return;
	}
	push_down(p);
	insert(2*p,l,r,k);
	insert(2*p+1,l,r,k);
	push_up(p);
}
int qurey(int p,int l,int r){
	if(l>seg[p].r or seg[p].l>r)return 0;
	if(r>=seg[p].r and seg[p].l>=l){
		return seg[p].sum;
	}
	push_down(p);
	return qurey(2*p,l,r)+qurey(2*p+1,l,r);
	
}
signed main() {
/*
5 5
1 5 4 2 3
2 2 4
1 2 3 2
2 3 4
1 1 5 1
2 1 4
*/	
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>in[i];
	}
	building(1,1,n);
//	for(int i=1;i<4*n;i++){
//		cout<<"l->r:  "<<seg[i].l<<" -> "<<seg[i].r<<"	sum:"<<seg[i].sum<<endl;
//	}
	for(int i=1;i<=m;i++){
		int leixin,x,y,k;
		cin>>leixin;
		cin>>x>>y;
		if(leixin==1){
			cin>>k;
			insert(1,x,y,k);
			for(int i=1;i<4*n;i++){
				cout<<"l->r:  "<<seg[i].l<<" -> "<<seg[i].r<<"	sum:"<<seg[i].sum<<endl;
			}
			cout<<endl;
		}
		else{
//			cout<<qurey(1,x,y)<<endl;

			for(int i=1;i<4*n;i++){
				cout<<"l->r:  "<<seg[i].l<<" -> "<<seg[i].r<<"	sum:"<<seg[i].sum<<endl;
			}
			cout<<endl;
		}
		
	}
	return 0;
}
2024/11/19 18:51
加载中...