1 条题解

  • 0
    @ 2026-8-4 20:19:14

    本题可以通过树状数组解决。

    #include<bits/stdc++.h>
    using namespace std;
    
    int n,q;
    
    struct node{
    	long long c[1000010];
    	void add(int x,long long y){
    		for(;x<=n;x+=x&-x) c[x]+=y;
    	}
    	long long ask(int x){
    		long long res=0;
    		for(;x;x-=x&-x) res+=c[x];
    		return res;
    	}
    }Td,Tb;
    
    long long a[1000010],d[1000010],b[1000010];
    
    long long query(long long r){
    	return (r+1)*Td.ask(r)-Tb.ask(r);
    }
    
    int main(){
    	cin>>n>>q;
    	for(int i=1;i<=n;i++){
    		cin>>a[i];
    		d[i]=a[i]-a[i-1];
    		b[i]=1LL*i*d[i];
    		Td.add(i,d[i]);
    		Tb.add(i,b[i]);
    	}
    	
    	while(q--){
    		int op;
    		cin>>op;
    		if(op==1){
    			long long l,r,x;
    			cin>>l>>r>>x;
    			Td.add(l,x);
    			if(r+1<=n) Td.add(r+1,-x);
    			Tb.add(l,l*x);
    			if(r+1<=n) Tb.add(r+1,-(r+1)*x);
    		}else{
    			int l,r;
    			cin>>l>>r;
    			cout<<query(r)-query(l-1)<<endl;
    		}
    	}
    }
    
    • 1

    信息

    ID
    126
    时间
    1000ms
    内存
    256MiB
    难度
    4
    标签
    递交数
    1
    已通过
    1
    上传者