请问各位大佬有什么优化方法,我T了三个点
#include<stdio.h>
struct xdtr {
int l,r;
long long he;
} a[400001];
long long in[400001];
int m,n;
void init(int p,int l,int r) {
a[p].l=l;
a[p].r=r;
if(l==r) {
a[p].he=in[l];
return ;
}
int mid=(l+r)/2;
init(p*2,l,mid);
init(p*2+1,mid+1,r);
a[p].he=a[p*2].he+a[p*2+1].he;
}
void k1(int p,int l,int r,long long num) {
if(a[p].l>=l&&a[p].r<=r&&a[p].l==a[p].r) {
a[p].he+=num;
return ;
}
int mid=(a[p].l+a[p].r)/2;
if(l<=mid)
k1(p*2,l,r,num);
if(r>mid)
k1(p*2+1,l,r,num);
a[p].he=a[p*2].he+a[p*2+1].he;
}
long long k2(int p,int l,int r) {
if(a[p].l>=l&&a[p].r<=r)
return a[p].he;
long long ans=0;
int mid=(a[p].l+a[p].r)/2;
if(l<=mid)
ans+=k2(p*2,l,r);
if(r>mid)
ans+=k2(p*2+1,l,r);
return ans;
}
long long read() {
long long s=0,w=1;
char ch;
while((ch=getchar())>'9'||ch<'0')
if(ch=='-')
w=-1;
while(ch>='0'&&ch<='9') {
s=s*10+ch-'0';
ch=getchar();
}
return s*w;
}
int main() {
n=read(),m=read();
for(int i=1; i<=n; i++)
in[i]=read();
init(1,1,n);
for(int i=1; i<=m; i++) {
int x,y,k;
k=read(),x=read(),y=read();
if(k==1) {
long long num;
num=read();
k1(1,x,y,num);
} else
printf("%lld\n",k2(1,x,y));
}
return 0;
}