这题能用分块吗???样例能过,交上去全WA!求大佬康康
查看原帖
这题能用分块吗???样例能过,交上去全WA!求大佬康康
400593
wuyiduo楼主2021/10/6 15:35
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
struct Node{
	long long sum;
	int l,r;
}s[1010];
int a[N],o,le,ri,pos[N],n,q;
int main(){
	scanf("%d%d",&n,&q);
	int x=ceil(sqrt(n));//每块个数
	int t=ceil(n*1.0/x);//分块个数 
	for(int i=1;i<=t-1;i++){
		s[i].l=(i-1)*x+1;
		s[i].r=i*x;
	}
	s[t].l=(t-1)*x+1;
	s[t].r=n;
	for(int i=1;i<=n;i++) {
		scanf("%d",&a[i]);
		s[i/x+1].sum+=a[i];
		pos[i]=i/x+1;
	}
	while(q--){
		scanf("%d%d%d",&o,&le,&ri);
		if(o==2){
			long long res=0;
			if(pos[ri]-pos[le]<=1){
				for(int i=le;i<=ri;i++) res+=a[i];
			}
			else{
				for(int i=le;i<=s[pos[le]].r;i++) res+=a[i];
				for(int i=pos[le]+1;i<=pos[ri]-1;i++) res+=s[i].sum;
				for(int i=s[pos[ri]].r;i<=ri;i++) res+=a[i];
			}
			printf("%lld\n",res);
		}
		else{
			a[le]+=ri;
			s[pos[le]].sum+=ri;
		}
	}
	return 0;
}
2021/10/6 15:35
加载中...