分块70pts求调
查看原帖
分块70pts求调
1054608
kanzaki楼主2024/1/27 11:03

tt 了 33 个点

#include <bits/stdc++.h>
using namespace std;
#define maxn 500005
int a[maxn],sum[maxn],pos[maxn],n,m,bl,bll;
int L[maxn],R[maxn];
void up(int u,int x){
	for(int i=L[u];i<=R[u];i++){
		a[i]+=x;
	}
}
void add(int l,int r,int x){
	int ql=pos[l],qr=pos[r];
	if(ql==qr){
		for(int i=l;i<=r;i++){
			a[i]+=x;
		}
		return ;
	}
	for(int i=l;i<=R[ql];i++){
		a[i]+=x;
	}
	for(int i=L[qr];i<=r;i++){
		a[i]+=x;
	}
	for(int i=ql+1;i<qr;i++){
		sum[i]+=x*bll;
		up(i,x);
	}
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	bl=sqrt(n);
	bll=bl;
	for(int i=1;i<=bl;i++){
		L[i]=R[i-1]+1;
		R[i]=i*bl;
	}
	if(R[bl]<n){
		bl++;
		R[bl]=n;
		L[bl]=R[bl-1]+1;
	}
	for(int i=1;i<=n;i++){
		pos[i]=(i-1)/bl+1;
	}
	while(m--){
		int op,l,r,x;
		cin>>op;
		if(op==1){
			cin>>l>>r>>x;
			add(l,r,x);
		}
		else if(op==2){
			cin>>l;
			cout<<a[l]<<'\n';
		}
	}
	return 0;
} 
2024/1/27 11:03
加载中...