- 玄关求调
QIUTIAO
- @ 2025-8-21 17:26:04
using namespace std;
const int N = 2000010;
const int INF = 1 << 30;
struct Treap {
int rt, cnt[N], dat[N], son[N][2], val[N], siz[N];
void split(int p, int x, int &l, int &r) {
if (!p) { l = r = 0; return; }
if (val[p] <= x) {
l = p;
split(son[p][1], x, son[p][1], r);
} else {
r = p;
split(son[p][0], x, l, son[p][0]);
}
siz[p] = siz[son[p][0]] + siz[son[p][1]] + 1;
}
int merge(int l, int r) {
if (!l || !r) return l + r;
if (dat[l] > dat[r]) {
son[l][1] = merge(son[l][1], r);
siz[l] = siz[son[l][0]] + siz[son[l][1]] + 1;
return l;
} else {
son[r][0] = merge(l, son[r][0]);
siz[r] = siz[son[r][0]] + siz[son[r][1]] + 1;
return r;
}
}
void insert(int x) {
static int idx = 0;
int l, r;
split(rt, x, l, r);
val[++idx] = x;
dat[idx] = rand();
siz[idx] = 1;
rt = merge(merge(l, idx), r);
}
void remove(int x) {
int l, r, p;
split(rt, x, l, r);
split(l, x-1, l, p);
if (p) {
p = merge(son[p][0], son[p][1]);
rt = merge(merge(l, p), r);
} else {
rt = merge(l, r);
}
}
int rnk(int x) {
int l, r;
split(rt, x-1, l, r);
int res = siz[l] + 1;
rt = merge(l, r);
return res;
}
int kth(int p, int k) {
if (k == siz[son[p][0]] + 1) return p;
if (k <= siz[son[p][0]]) return kth(son[p][0], k);
return kth(son[p][1], k - siz[son[p][0]] - 1);
}
int get_pre(int x) {
int l, r;
split(rt, x-1, l, r);
int res = -INF;
if (l) res = val[kth(l, siz[l])];
rt = merge(l, r);
return res;
}
int get_nxt(int x) {
int l, r;
split(rt, x, l, r);
int res = INF;
if (r) res = val[kth(r, 1)];
rt = merge(l, r);
return res;
}
} sgap, mgap;
int last[N]; // 新增:记录每个位置最后一个元素
int min_sort_gap = INF; // 新增:维护全局最小排序差
int s[N],sm[N];
int main() {
int n, m;
cin >> n >> m;
// 初始化部分
for (int i = 1; i <= n; i++) {
int a;
cin >> s[i];
last[i] = s[i];sm[i]=s[i ];// 记录最后元素
sgap.insert(s[i]);
if (i > 1) {
mgap.insert(abs(s[i] - s[i - 1]));
}
}
// 初始化最小排序差
sort(sm+1,sm+1+n);
for(int i=1;i<n;i++){
min_sort_gap=min(min_sort_gap,sm[i+1]-sm[i]);
}
while (m--) {
string opt;
cin >> opt;
if (opt == "INSERT") {
int pos, k;
cin >> pos >> k;
mgap.remove(abs(last[pos] - s[pos + 1])); // 删除旧差
mgap.insert(abs(k - s[pos + 1])); // 插入新差
mgap.insert(abs(k - last[pos])); // 插入前差
int pre = sgap.get_pre(k);
int nxt = sgap.get_nxt(k);
min_sort_gap = min(min_sort_gap, k - pre);
min_sort_gap = min(min_sort_gap, nxt - k);
sgap.insert(k);
last[pos] = k;
} else if (opt == "MIN_GAP") {
cout << mgap.kth(mgap.rt, 1) << endl;
} else if (opt == "MIN_SORT_GAP") {
cout << min_sort_gap << endl;
}
}
return 0;
}
0 条评论
目前还没有评论...