RT,样例在最后一个输入时getpre和getnxt死循环,getval中rt以及v为0,蒟蒻以调不动,求助
#include <bits/stdc++.h>
#define upf(i, n, k) for (int i = k; i <= n; i++)
#define lowf(i, n, k) for (int i = n; i >= k; i--)
#define Max(a, b, c) max(a, max(b, c))
#define Min(a, b, c) min(a, min(b, c))
#define ofile(N) freopen(N ".in", "r", stdin), freopen(N ".out", "w", stdout)
#define ri register int
#define ie inline
#define ll long long
using namespace std;
ie int read() {
int s = 0, w = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-')
w = -1;
ch = getchar();
}
while (ch >= '0' && ch <= '9')
s = s * 10 + ch - '0', ch = getchar();
return s * w;
}
ie void out(int a) {
if (a >= 10)
out(a / 10);
putchar(a % 10 + '0');
}
struct fhqTreap {
int l, r, val, rnd, size;
} tr[100005];
int rt, idx;
int n, op, v;
int a[111111];
inline void add(int &x, int v) {
x = ++idx, tr[x].val = v, tr[x].rnd = rand(), tr[x].size = 1;
}
inline void pushup(int p) {
tr[p].size = tr[tr[p].l].size + tr[tr[p].r].size + 1;
}
inline void spilt(int p, int v, int &x, int &y) {
if (!p) return x = y = 0, void();
if (tr[p].val <= v) {
x = p;
spilt(tr[x].r, v, tr[x].r, y), pushup(x);
} else {
y = p;
spilt(tr[y].l, v, x, tr[y].l), pushup(y);
}
}
inline int merge(int x, int y) {
if (!x || !y) return x + y;
if (tr[x].rnd < tr[y].rnd) {
tr[x].r = merge(tr[x].r, y);
pushup(x);
return x;
} else {
tr[y].l = merge(x, tr[y].l), pushup(y);
return y;
}
}
inline void del(int v) {
int x, y, z;
spilt(rt, v, x, z);
spilt(x, v - 1, x, y);
y = merge(tr[y].l, tr[y].r);
rt = merge(merge(x, y), z);
}
inline void ins(int v) {
int x, y, z;
spilt(rt, v, x, y);
add(z, v);
rt = merge(merge(x, z), y);
}
inline int getrank(int v) {
int x, y, z;
spilt(rt, v - 1, x, y);
int ans = tr[x].size + 1;
rt = merge(x, y);
return ans;
}
inline int getval(int root, int v) {
if (v == tr[tr[root].l].size + 1)
return tr[root].val;
else if (v <= tr[tr[root].l].size)
return getval(tr[root].l, v);
else
return getval(tr[root].r, v - tr[tr[root].l].size - 1);
}
inline int getnxt(int v) {
int x, y, s, ans;
spilt(rt, v, x, y);
ans = getval(y, 1);
rt = merge(x, y);
return ans;
}
inline int getpre(int v) {
int x, y, s, ans;
spilt(rt, v - 1, x, y);
s = tr[x].size;
ans = getval(x, s);
rt = merge(x, y);
return ans;
}
int rettt;
int main() {
// ofile("");ertertert
n = read();
a[1] = read();
ins(a[1]);
ins(21e8);
ins(-21e8);
rettt += a[1];
for(int i = 2; i <= n; i++) {
a[i] = read();
int x = getpre(a[i]), y = getnxt(a[i]);
if(x != -21e8 || y != 21e8)
rettt += min(abs(x - a[i]), abs(y - a[i]));
ins(a[i]);
}
cout << rettt << endl;
return 0;
}