怎么肥似鸭,这题卡分块吗
#include<bits/stdc++.h>
/*#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#define min(x,y) x>y?y:x
#define max(x,y) x>y?x:y*/
#define N 500005
using namespace std;
int a[N],f[N],sum[N],sumr[N];
int n,p,sq;
/*void printt(){
for(int i=1;i<=n;i++){
cout<<f[i]<<" ";
}
cout<<endl;
}
void print(){
for(int i=1;i<=n;i++){
cout<<a[i]<<" ";
}
cout<<endl;
}*/
void change(int l,int r,int k){
for(int i=l;i<=min(f[l]*sq,r);i++){
a[i]+=k;
sum[f[i]]+=k;
}
for(int i=f[l]+1;i<=f[r]-1;i++){
sum[i]+=sq*k;
sumr[i]+=k;
}
if(f[l]!=f[r]){
for(int i=(f[r]-1)*sq+1;i<=r;i++){
a[i]+=k;
sum[f[i]]+=k;
}
}
}
/*int query(int l,int r){
int ans=0;
for(int i=l;i<=min(f[l]*sq,r);i++){
ans+=a[i];
ans+=sumr[f[i]];
}
for(int i=f[l]+1;i<f[r];i++){
ans+=sum[i];
}
if(f[l]!=f[r]){
for(int i=(f[r]-1)*sq+1;i<=r;i++){
ans+=a[i];
ans+=sumr[f[i]];
}
}
return ans;
}*/
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>p;
sq=sqrt(n);
for(int i=1;i<=n;i++){
f[i]=(i-1)/sq+1;
cin>>a[i];
sum[f[i]]+=a[i];
}
//printt();
while(p--){
int cmd,x,y,k;
cin>>cmd;
if(cmd==1){
cin>>x>>y>>k;
change(x,y,k);
}
else if(cmd==2){
cin>>x;
cout<<a[x]+sumr[f[x]]<<endl;
}
//cout<<endl;
//print();
}
return 0;
}
已经开了 C艹17 吸氧......然鹅还是T掉两个点......

这题不会真的卡分块吧

但是我分块过了树状数组1就有点谔谔......

求大佬帮忙卡卡常呗
