洛谷测出来MLE,本地 modify a 和modify b好像没问题,测到query的时候直接RE了,纯萌新求调!
#include<bits/stdc++.h>
#define MAXN 500005
#define ll long long
#define lc (u << 1)
#define rc (u << 1 | 1)
#define INF 0x3f3f3f3f
int L, R, a[MAXN], b[MAXN];
struct node
{
int MaxA, MinB, MaxL, MaxR, ans;
}t[MAXN << 2];
void pushup(int u)
{
t[u].MaxA = std::max(t[lc].MaxA, t[rc].MaxA);
t[u].MinB = std::min(t[lc].MinB, t[rc].MinB);
t[u].MaxL = std::max(t[lc].MaxL, t[rc].MaxL);
t[u].MaxR = std::max(t[lc].MaxR, t[rc].MaxR);
t[u].ans = std::max(std::max(t[lc].ans, t[rc].ans), std::max(t[lc].MaxL + t[rc].MaxA, t[lc].MaxA + t[rc].MaxR));
}
void build(int u, int l, int r)
{
t[u].MaxL = t[u].MaxR = t[u].ans = -INF;
if(l == r)
{
t[u].MaxA = a[l];
t[u].MinB = a[l];
return;
}
int mid = (l + r) >> 1;
build(lc, l, mid);
build(rc, mid + 1, r);
pushup(u);
}
void modify_A(int u, int pos, int v,int l, int r)
{
if(l > pos || r < pos)
return;
if(l == r)
{
t[u].MaxA = v;
return ;
}
int mid = (l + r) >> 1;
modify_A(lc, pos, v, l, mid);
modify_A(rc, pos, v, mid + 1, r);
pushup(u);
}
void modify_B(int u, int pos, int v,int l, int r)
{
if(l > pos || r < pos)
return;
if(l == r)
{
t[u].MinB = v;
return ;
}
int mid = (l + r) >> 1;
modify_B(lc, pos, v, l, mid);
modify_B(rc, pos, v, mid + 1, r);
pushup(u);
}
node query(int u, int l, int r)
{
if(l > R || r < L)
return (node){-INF,INF,-INF,-INF,-INF};
if(l >= L && r <= R)
return t[u];
node tl = query(lc, l, r), tr = query(rc, l, r), res;
res.MaxA = std::max(tl.MaxA, tr.MaxA);
res.MinB = std::max(tl.MinB, tr.MinB);
res.MaxL = std::max(tl.MaxL, std::max(tr.MaxL, tl.MaxA - tr.MinB));
res.MaxR = std::max(tr.MaxR, std::max(tl.MaxR, tr.MaxA - tl.MinB));
res.ans = std::max(std::max(tl.ans, tr.ans), std::max(tl.MaxL + tr.MaxA, tr.MaxR + tl.MaxA));
return res;
}
int read()
{
int x = 0, f = 1;
char ch = getchar();
while(!isdigit(ch))
{
if(ch == '-')
f = -1;
ch = getchar();
}
while(isdigit(ch))
{
x = (x << 1) + (x << 3) + ch - '0';
ch = getchar();
}
return x * f;
}
int main()
{
int n = read(), m = read();
for(int i = 1; i <= n; i++)
a[i] = read();
for(int i = 1; i <= n; i++)
b[i] = read();
build(1,1,n);
for(int i = 1; i <= m; i++)
{
int opt = read();
L = read(), R = read();
if(opt == 1)
modify_A(1, L, R, 1, n);
else if(opt == 2)
modify_B(1, L, R, 1, n);
else
printf("%d\n", query(1, 1, n).ans);
}
return 0;
}