社区讨论
萌新线段树 9分 求助
P4513小白逛公园参与者 2已保存回复 5
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 5 条
- 当前快照
- 1 份
- 快照标识符
- @lo8jqsxl
- 此快照首次捕获于
- 2023/10/27 19:45 2 年前
- 此快照最后确认于
- 2023/10/27 19:45 2 年前
只对了#1
调了一上午也不明白哪里出问题了qwq
CPP#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+10,Inf=9223372036854775807;
char cch;
int res,zf;
inline int rd()
{
while((cch=getchar())<45);
if(cch^45)res=cch^48,zf=1;
else res=0,zf=-1;
while((cch=getchar())>=48)res=(res*10)+(cch^48);
return res*zf;
}
int n=rd(),T=rd();
struct Tree
{
int l,r;
int mx,mxl,mxr;
int sum;
}t[N<<2];
inline void pushup(int u)
{
t[u].sum=t[u<<1].sum+t[u<<1|1].sum;
t[u].mx=max(max(t[u<<1].mx,t[u<<1|1].mx),t[u<<1].mxr+t[u<<1|1].mxl);
t[u].mxl=max(t[u<<1].mxl,t[u<<1].sum+t[u<<1|1].mxl);
t[u].mxr=max(t[u<<1|1].mxr,t[u<<1|1].sum+t[u<<1].mxr);
}
inline void build(int u,int l,int r)
{
t[u].l=l,t[u].r=r;
if(l==r)
{
t[u].sum=t[u].mx=t[u].mxl=t[u].mxr=rd();
return;
}
int mid=(t[u].l+t[u].r)>>1;
build(u<<1,l,mid);
build(u<<1|1,mid+1,r);
pushup(u);
}
inline void update(int u,int p,int k)
{
if(t[u].l==t[u].r)
{
t[u].sum=t[u].mx=t[u].mxl=t[u].mxr=k;
return;
}
int mid=(t[u].l+t[u].r)>>1;
if(mid>=p) update(u<<1,p,k);
else update(u<<1|1,p,k);
pushup(u);
}
inline int query(int u,int l,int r)
{
if(l<=t[u].l&&r>=t[u].r) return t[u].mx;
int mid=(t[u].l+t[u].r)>>1,mx=-Inf;
if(l<=mid) mx=query(u<<1,l,r);
if(r>mid) mx=max(mx,query(u<<1|1,l,r));
return mx;
}
int opt;
int kl,kr;
signed main()
{
build(1,1,n);
while(T--)
{
opt=rd();
kl=rd(),kr=rd();
switch(opt)
{
case 1:if(kl>kr)swap(kl,kr);cout<<query(1,kl,kr)<<'\n';break;
case 2:update(1,kl,kr);break;
}
}
return 0;
}
回复
共 5 条回复,欢迎继续交流。
正在加载回复...