@[CrazyProgrammer](/user/914391)
您要不要参考一下我写的
```cpp
/*
Author:Kevin Z K Y
temp
*/
#include <bits/stdc++.h>
#define putendl putchar('\n')
#define putspace putchar(' ')
#define rep(f,a) for(auto (f):(a))
#define up(a,b,c) for(int (a)=(b);(a)<=(c);(a)++)
#define dn(a,b,c) for(int (a)=(b);(a)>=(c);(a)--)
using namespace std;
using vi = vector<int> ;
using ll = long long ;
using hint = __int128 ;
using PII = pair<int,int> ;
using PLL = pair<ll,ll> ;
const double eps=1e-6;
const int N=1e5+5;
struct segment_tree{
int s[(N<<2)],t[(N<<2)];
#define mid ((l+r)/2)
int ls(int x){return x*2;}
int rs(int x){return x*2+1;}
void push_up(int p){s[p]=s[ls(p)]+s[rs(p)];}
void add_tag(int l,int r,int x,int p){s[p]+=(1ll*r-l+1)*x;t[p]+=x;}
void push_down(int l,int r,int p){
if(t[p]==0)return ;
add_tag(l,mid,t[p],ls(p));add_tag(mid+1,r,t[p],rs(p));
t[p]=0;
}
void build(int l,int r,int p){
if(l==r){
int x=readi();
s[p]=x;
t[p]=0;
return ;
}
build(l,mid,ls(p));build(mid+1,r,rs(p));
push_up(p);
}
void add(int l,int r,int L,int R,int x,int p){
if(r<L||l>R)return ;
if(l>=L&&r<=R){
add_tag(l,r,x,p);
return ;
}
push_down(l,r,p);
add(l,mid,L,R,x,ls(p));add(mid+1,r,L,R,x,rs(p));
push_up(p);
}
int ask(int l,int r,int L,int R,int p){
if(r<L||l>R)return 0;
if(l>=L&&r<=R)return s[p];
push_down(l,r,p);
return ask(l,mid,L,R,ls(p))+ask(mid+1,r,L,R,rs(p));
}
#undef mid
};
int main(){
ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(nullptr);
return 0;
}
```
by kevinZ99 @ 2024-04-13 11:40:43
@[kevinZ99](/user/1117080) 谢谢,但是一个~~睿智的~~人工智能帮我找出来了
by CrazyProgrammer @ 2024-04-13 11:42:06
@[CrazyProgrammer](/user/914391) 常数问题。
线段树在递归后判定是否 return 不如直接在递归前判断。
具体的,我改了您的 update 和 query 部分的代码,如下。
```cpp
void change(int p,int l,int r,int x,int y,int v){
if((l>y&&r<x)||l>r)return;
if(l>=x&&r<=y){
s[p]+=(r-l+1)*v;
add[p]+=v;
return;
}
int m=(l+r)/2;
push_down(p,l,r);
if(m>=x)
{
change(p*2,l,m,x,y,v);
}
if(m+1<=y)
{
change(p*2+1,m+1,r,x,y,v);
}
s[p]=s[p*2]+s[p*2+1];
return;
}
int getsum(int p,int l,int r,int x,int y){
if(l>y||r<x)return 0;
if(l>=x&&r<=y)return s[p];
int m=(l+r)/2;
push_down(p,l,r);
int ans=0;
if(m>=x)
{
ans+=getsum(p*2,l,m,x,y);
}
if(m+1<=y)
{
ans+=getsum(p*2+1,m+1,r,x,y);
}
return ans;
}
```
by Exp10re @ 2024-04-13 11:44:35
应该是有一处 || 写成 && 了吧(
by vflower @ 2024-04-13 11:46:06
线段树可爱。
顺便一提,可以参考一下[我的马蜂](https://www.luogu.com.cn/paste/d4v5yaxl)。
by Exp10re @ 2024-04-13 11:47:03
@[vflower](/user/1000066) 乐 还真是
by Exp10re @ 2024-04-13 11:47:39
@[Exp10re](/user/403069) 谢谢,非常正确的建议
有趣的是为什么会TLE而不是WA
by CrazyProgrammer @ 2024-04-13 12:44:48
我在网站上回过你了。读入的问题。
by llltom @ 2024-04-13 13:39:29