分块最后一个点为什么T了
查看原帖
分块最后一个点为什么T了
1636931
_________AC_________楼主2025/7/23 11:33
#include<bits/stdc++.h>
using namespace std;
int n,f,sum,id[200005];
long long m[200005],g[200005];
int main(){
	scanf("%d%d",&n,&f);
	sum=sqrt(n);
	for(int i=1;i<=n;i++){
		scanf("%lld",&m[i]);
		id[i]=(i-1)/sum+1;
	}
	for(int i=1;i<=f;i++){
		int x;
		scanf("%d",&x);
		if(x==1){
			int l,r;
			long long k;
			scanf("%d%d %lld",&l,&r,&k);
			int start=id[l],end=id[r];
			for(int i=l;i<=min(r,start*sum);i++)m[i]+=k;
			if(start!=end)for(int i=end*sum-sum+1;i<=r;i++)m[i]+=k;
			for(int i=start+1;i<=end-1;i++)g[i]+=k;
		}
		else if(x==2){
			long long k;
			scanf("%lld",&k);
			m[1]+=k;
		}
		else if(x==3){
			long long k;
			scanf("%lld",&k);
			m[1]-=k;
		}
		else if(x==4){
			int l,r;
			long long cnt=0;
			scanf("%d%d",&l,&r);
			for(int j=l;j<=r;j++)cnt+=m[j]+g[id[j]];
			printf("%lld\n",cnt);
		}
		else printf("%lld\n",m[1]);
	}
	return 0;
} 
2025/7/23 11:33
加载中...