全WA线段树求助
查看原帖
全WA线段树求助
334756
AyaMomizi楼主2020/7/29 22:03
#include<bits/stdc++.h>
using namespace std;
int input[100010];
struct DATA{
    long long l,r,lazy,sum;
}tree[500010];
void Build(int s,int l,int r){
    tree[s].l=l;
    tree[s].r=r;
    if(l==r){
        tree[s].sum=input[l];
        return;
    }
    int mid=(l+r)/2;
    Build(s*2,l,mid);
    Build(s*2+1,mid+1,r);
    tree[s].sum=tree[s*2].sum+tree[s*2+1].sum;
}
void Godown(int s){
    tree[s*2].lazy+=tree[s].lazy;
    tree[s*2].sum+=(tree[s*2].r-tree[s*2].l+1)*tree[s].lazy;
    tree[s*2+1].lazy+=tree[s].lazy;
    tree[s*2+1].sum+=(tree[s*2+1].r-tree[s*2+1].l+1)*tree[s].lazy;
    tree[s].lazy=0;
}
void Update(int s,int l,int r,int v){
    if(tree[s].l>r || tree[s].r<l)
        return;
    if(tree[s].l>=l && tree[s].r<=r){
		tree[s].lazy+=v;
		tree[s].sum+=(tree[s].r-tree[s].l+1)*v;
		return;
	}
	if(tree[s].lazy>0)
        Godown(s);
	Update(s*2,l,r,v);
	Update(s*2+1,l,r,v);
	tree[s].sum=tree[s*2].sum+tree[s*2+1].sum;
}
long long Search(int s,int l,int r)
{
	if(tree[s].l>r || tree[s].r<l)
        return 0;
	if(tree[s].l>=l && tree[s].r<=r)
        return tree[s].sum;
	if(tree[s].lazy>0)
        Godown(s);
	return Search(s*2,l,r)+Search(s*2+1,l,r);
}
int main(){
    int m,n;
    cin>>m>>n;
    for(int i=1;i<=m;i++)
        cin>>input[i];
    Build(1,1,m);
    for(int i=1;i<=n;i++){
        int q,w,e;
        cin>>q;
        if(q==1){
            int v_;
            cin>>w>>e>>v_;
            Update(1,w,e,v_);
        }
        else{
            cin>>w>>e;
            cout<<Search(1,w,e);
        }
    }
}
2020/7/29 22:03
加载中...