树状数组20pts,最后一个点AC
查看原帖
树状数组20pts,最后一个点AC
1329138
luogu_hezhenmin1楼主2024/10/20 21:19

马蜂惨不忍睹

#include<bits/stdc++.h>
#define int long long
#define lowbit(x) x&(-x)
using namespace std;
int n,a[200005],q;
int t1[200005],t2[200005];
void add(int p,int x){
	for(int i=p;i<=n;i+=lowbit(i))
	    t1[i]+=x,t2[i]+=x*p;
}
void qj_add(int l,int r,int x){
	add(l,x);add(r+1,-x);
}
int ask(int p){
	int res=0;
	for(int i = p; i; i -= lowbit(i))
        res+=(p+1)*t1[i]-t2[i];
    return res;
}
int qj_ask(int l,int r){
	return ask(r)-ask(l-1);
}
signed main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		add(i,a[i]-a[i-1]);
	}
	while(q--){
		int op;
		scanf("%lld",&op);
		if(op==1){
			int l,r,k;
			scanf("%lld%lld%lld",&l,&r,&k);
			qj_add(l,r,k);
		}
		else if(op==2){
			int k;
			scanf("%lld",&k);
			add(1,k);
		}
		else if(op==3){
			int k;
			scanf("%lld",&k);
			add(1,-k);
		}
		else if(op==4){
			int l,r;
			scanf("%lld%lld",&l,&r);
			printf("%lld\n",qj_ask(l,r));
		}
		else
			printf("%lld\n",ask(1));
	}
	return 0;
}
2024/10/20 21:19
加载中...