这份代码哪里有 ub??在本地和洛谷 ide 上输出不一样。
#include <bits/stdc++.h>
#define mid ((l + r) >> 1)
#define lx (x * 2)
#define rx (x * 2 + 1)
using namespace std;
const int N = 50000, INF = 0x3f3f3f3f, M = 3;
int n, a[N + 5];
void init()
{
scanf("%d", &n);
for(int i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
}
struct Ma
{
int a[M + 1][M + 1];
}mtx[N + 5], yuan;
Ma mul(Ma x, Ma y)
{
Ma ret;
for(int i = 1; i <= M; i++)
{
for(int j = 1; j <= M; j++)
{
int t = -INF;
for(int k = 1; k <= M; k++)
{
t = max(t, x.a[i][k] + y.a[k][j]);
}
ret.a[i][j] = t;
}
}
return ret;
}
void out(Ma x)
{
for(int i = 1; i <= M; i++)
{
for(int j = 1; j <= M; j++)
{
printf("%d ", x.a[i][j]);
}
printf("\n");
}
}
struct Tr
{
Ma x;
}tr[N * 4 + 5];
void pushup(int x)
{
tr[x].x = mul(tr[lx].x, tr[rx].x);
}
void build(int x, int l, int r)
{
if(l == r)
{
mtx[l].a[1][1] = 0, mtx[l].a[1][2] = -INF, mtx[l].a[1][3] = -INF;
mtx[l].a[2][1] = 0, mtx[l].a[2][2] = a[l], mtx[l].a[2][3] = -INF;
mtx[l].a[3][1] = -INF, mtx[l].a[3][2] = a[l], mtx[l].a[3][3] = 0;
tr[x].x = mtx[l];
return;
}
build(lx, l, mid);
build(rx, mid + 1, r);
pushup(x);
}
Ma ask(int x, int l, int r, int s, int t)
{
if(s > t)
{
return yuan;
}
if(l >= s && r <= t)
{
return tr[x].x;
}
Ma ret = yuan;
if(s <= mid)
{
ret = mul(ret, ask(lx, l, mid, s, t));
}
if(t > mid)
{
ret = mul(ret, ask(rx, mid + 1, r, s, t));
}
return ret;
}
void mdf(int x, int l, int r, int s)
{
if(l == r)
{
tr[x].x = mtx[l];
return;
}
if(s <= mid)
{
mdf(lx, l, mid, s);
}
else
{
mdf(rx, mid + 1, r, s);
}
pushup(x);
}
void solve()
{
for(int i = 1; i <= M; i++)
{
for(int j = 1; j <= M; j++)
{
if(i == j)
{
yuan.a[i][j] = 0;
}
else
{
yuan.a[i][j] = -INF;
}
}
}
build(1, 1, n);
int Q;
scanf("%d", &Q);
while(Q--)
{
int op;
scanf("%d", &op);
if(op == 0)
{
int x, k;
scanf("%d %d", &x, &k);
a[x] = k;
mtx[x].a[2][2] = a[x];
mtx[x].a[3][2] = a[x];
mdf(1, 1, n, x);
}
else
{
int l, r;
scanf("%d %d", &l, &r);
Ma ans;
ans.a[1][1] = -INF;
ans.a[1][2] = a[l];
// ask(1, 1, n, l + 1, r);
ans = mul(ans, ask(1, 1, n, l + 1, r));
out(ans);
printf("\n");
// out(ask(1, 1, n, l + 1, r));
// printf("\n");
// out(ans);
// printf("\n");
printf("####### %d\n", max(ans.a[1][1], ans.a[1][2]));
}
}
}
int main()
{
init();
solve();
return 0;
}