真的爬了。。调了好久了。样例都过了。
提供两种解法,全都 RE 了。
真的是萌新。
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#define vit vector<int>::iterator
#define rep(i, a, b) for (int i = (a); i <= (b); i ++ )
#define rop(i, a, b) for (int i = (a); i < (b); i ++ )
#define dep(i, a, b) for (int i = (a); i >= (b); i -- )
#define dop(i, a, b) for (int i = (a); i > (b); i -- )
using namespace std;
using LL = long long;
using PII = pair<int, int>;
using PLL = pair<LL, LL>;
const int INF = 2e9;
int n, m, S;
struct Ans {
int maxn, minn, dmin;
Ans() { maxn = -INF, dmin = minn = INF; }
Ans(int _max, int _min, int _d) { maxn = _max, minn = _min, dmin = _d; }
};
struct node {
node *pre, *next;
vector<int> v;
Ans ans;
node() { pre = next = NULL; v.clear(); }
vit vbegin() { return v.begin(); }
vit vend() { return v.end(); }
vit lower(int x) { return lower_bound(v.begin(), v.end(), x); }
vit upper(int x) { return upper_bound(v.begin(), v.end(), x); }
int front() { return *v.begin(); }
int back() { return v[v.size() - 1]; }
int vsize() { return v.size(); }
void insert(int x) { v.emplace_back(x); }
}*head;
#define fit(i, a, b) for (node *i = a; i != b; i = i -> next)
#define fit_to_end(i, a) for (node *i = a; i; i = i -> next)
struct Pair {
node *p; int d;
Pair() {}
Pair(node *_p, int _d) {p = _p, d = _d; }
};
Pair find(int x) { fit_to_end(p, head) { if (p -> vsize() >= x) return Pair(p, x - 1); x -= p -> vsize(); } }
void renew(Ans &x, Ans k) { x.maxn = max(x.maxn, k.maxn), x.minn = min(x.minn, k.minn), x.dmin = min(x.dmin, k.dmin); }
void rebuild(node *&p) {
if (p -> vsize() == 1) goto next_;
rep(i, 0, p -> vsize() - 2) renew(p -> ans, Ans((p -> v)[i], (p -> v)[i], abs((p -> v)[i] - (p -> v)[i + 1])));
rep(i, 1, p -> vsize() - 1) renew(p -> ans, Ans((p -> v)[i], (p -> v)[i], abs((p -> v)[i] - (p -> v)[i - 1])));
next_:; if (p -> next) renew(p -> ans, Ans(p -> back(), p -> back(), abs(p -> back() - p -> next -> front())));
if (p -> pre) renew(p -> ans, Ans(p -> front(), p -> front(), abs(p -> front() - p -> pre -> back())));
}
void split(node *&p) { // ½«´ó¿é·ÖÁѳÉÁ½¸öС¿é
node *q = new node();
if (p -> next) q -> next = p -> next; if (q -> next) q -> next -> pre = q;
p -> next = q, q -> pre = p;
rop(i, S, p -> vsize()) q -> insert((p -> v)[i]);
(p -> v).erase(p -> vbegin() + S, p -> vend());
rebuild(p), rebuild(q);
}
void insert(int x, int val) {
Pair _p = find(x); node *p = _p.p; int d = _p.d;
(p -> v).emplace(p -> vbegin() + d, val);
if (p -> vsize() >= 2 * S) split(p);
else rebuild(p);
}
void merge(int x, int val) {
Pair _p = find(x); node *p = _p.p; int d = _p.d;
if (d == p -> vsize() - 1) (p -> next -> v).erase(p -> next -> vbegin()), rebuild(p -> next);
else (p -> v).erase(p -> vbegin() + d + 1);
(p -> v).emplace(p -> vbegin() + d + 1, val);
(p -> v).erase(p -> vbegin() + d);
}
int query_max(int l, int r) {
Pair _l = find(l), _r = find(r);
node *lc = _l.p, *rc = _r.p;
int ld = _l.d, rd = _r.d, ans = -INF;
if (lc == rc) {
rep(i, ld, rd) ans = max(ans, (lc -> v)[i]);
return ans;
}
rop(i, ld, lc -> vsize()) ans = max(ans, (lc -> v)[i]);
rep(i, 0, rd) ans = max(ans, (rc -> v)[i]);
if (lc -> next == rc) return ans;
fit(i, lc -> next, rc) ans = max(ans, (i -> ans).maxn);
return ans;
}
int query_min(int l, int r) {
Pair _l = find(l), _r = find(r);
node *lc = _l.p, *rc = _r.p;
int ld = _l.d, rd = _r.d, ans = INF;
if (lc == rc) {
rep(i, ld, rd) ans = min(ans, (lc -> v)[i]);
return ans;
}
rop(i, ld, lc -> vsize()) ans = min(ans, (lc -> v)[i]);
rep(i, 0, rd) ans = min(ans, (rc -> v)[i]);
if (lc -> next == rc) return ans;
fit(i, lc -> next, rc) ans = min(ans, (i -> ans).minn);
return ans;
}
int query_d(int l, int r) {
Pair _l = find(l), _r = find(r);
node *lc = _l.p, *rc = _r.p;
int ld = _l.d, rd = _r.d, ans = INF;
if (lc == rc) {
if (lc == rc) goto next_;
rep(i, ld, rd - 1) ans = min(ans, abs((lc -> v)[i] - (lc -> v)[i + 1]));
rep(i, ld + 1, rd) ans = min(ans, abs((lc -> v)[i] - (lc -> v)[i - 1]));
next_:; if (rd == lc -> vsize() - 1 && lc -> next) ans = min(ans, abs(lc -> next -> front() - lc -> back()));
if (ld == 0 && lc -> pre) ans = min(ans, abs(lc -> pre -> back() - lc -> front())); return ans;
}
if (ld == 0 && lc -> pre) { ans = min(ans, abs(lc -> front() - lc -> pre -> back())); ld ++ ; }
if (rd == rc -> vsize() - 1 && rc -> next) { ans = min(ans, abs(rc -> back() - rc -> next -> front())); rd -- ; }
rep(i, ld, lc -> vsize() - 1) ans = min(ans, abs((lc -> v)[i] - (lc -> v)[i - 1]));
rep(i, 0, rd) ans = min(ans, abs((rc -> v)[i] - (rc -> v)[i + 1]));
for (node *i = lc -> next; i != rc; i = i -> next) ans = min(ans, (i -> ans).dmin);
return ans;
}
int main() {
scanf("%d%d", &n, &m); S = (int)sqrt(n);
head = new node(); node *now = head;
for (int i = 0; i < n; i ++ ) {
int w; scanf("%d", &w);
if (i % S == 0)
now -> next = new node(), now = now -> next;
now -> insert(w);
}
for (node *i = head; i; i = i -> next) rebuild(i);
while (m -- ) {
char op[7]; int a, b;
scanf("%s%d%d", op, &a, &b);
if (*op == 'i') insert(a, b);
else if (op[1] == 'e') merge(a, b);
else if (op[1] == 'a') printf("%d\n", query_max(a, b) - query_min(a, b));
else {
if (a + 1 == b) printf("%d\n", query_max(a, b) - query_min(a, b));
else printf("%d\n", query_d(a, b));
}
}
return 0;
}
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <vector>
#include <cmath>
#define rep(i, a, b) for (int i = (a); i <= (b); i ++ )
#define rop(i, a, b) for (int i = (a); i < (b); i ++ )
#define dep(i, a, b) for (int i = (a); i >= (b); i -- )
#define dop(i, a, b) for (int i = (a); i > (b); i -- )
using namespace std;
using LL = long long;
using PII = pair<int, int>;
using PLL = pair<LL, LL>;
const int INF = 2e9;
int S, n, m;
struct node {
int maxn, minn, dmin;
node() { maxn = -INF, minn = dmin = INF; }
node(int _, int __, int ___) {maxn = _, minn = __, dmin = ___; }
void renew(int _, int __, int ___) {
maxn = max(maxn, _), minn = min(minn, __), dmin = min(dmin, ___);
}
};
vector<vector<int>> v;
vector<node> res;
PII find(int x) {
rop(i, 0, v.size()) {
if (x - v[i].size() <= 0) return make_pair(i, x);
x -= v[i].size();
}
}
node rebuild(int p) {
node ans(-INF, INF, INF);
rop(i, 0, v[p].size() - 1) ans.renew(v[p][i], v[p][i], abs(v[p][i] - v[p][i + 1]));
ans.maxn = max(ans.maxn, v[p].back()); ans.minn = min(ans.minn, v[p].back());
return ans;
}
void split(int p) {
v.emplace(v.begin() + p + 1, v[p].begin() + S, v[p].end());
v[p].erase(v[p].begin() + S, v[p].end());
res.emplace(res.begin() + p + 1, rebuild(p + 1));
res[p] = rebuild(p);
}
void insert(int x, int val) {
PII pos = find(x); int p = pos.first, d = pos.second;
v[p].emplace(v[p].begin() + d - 1, val);
if (v[p].size() >= 2 * S) { split(p); return; }
res[p].renew(val, val, abs(v[p][d - 1] - v[p][d]));
}
void merge(int x, int val) {
PII pos = find(x); int p = pos.first, d = pos.second;
if (d == v[p].size()) v[p + 1].erase(v[p + 1].begin());
else v[p].erase(v[p].begin() + d);
v[p].erase(v[p].begin() + d - 1); v[p].emplace(v[p].begin() + d - 1, val);
res[p].renew(val, val, (d == v[p].size()) ? INF : abs(v[p][d - 1] - v[p][d]));
}
int query_max(int l, int r) {
PII lc = find(l), rc = find(r);
int lp = lc.first, rp = rc.first; // rp ++
int ld = lc.second - 1, rd = rc.second - 1;
int ans = -INF;
if (lp == rp) {
rep(i, ld, rd) ans = max(ans, v[lp][i]);
return ans;
}
rop(i, ld - 1, v[lp].size()) ans = max(ans, v[lp][i]);
rep(j, 0, rd) ans = max(ans, v[rp][j]);
rep(k, lp + 1, rp - 1) ans = max(ans, res[k].maxn);
return ans;
}
int query_min(int l, int r) {
PII lc = find(l), rc = find(r);
int lp = lc.first, rp = rc.first; // rp ++
int ld = lc.second - 1, rd = rc.second - 1;
int ans = INF;
if (lp == rp) {
rep(i, ld, rd) ans = min(ans, v[lp][i]);
return ans;
}
rop(i, ld, v[lp].size()) ans = min(ans, v[lp][i]);
rep(j, 0, rd) ans = min(ans, v[rp][j]);
rep(k, lp + 1, rp - 1) ans = min(ans, res[k].minn);
return ans;
}
int query_d(int l, int r) {
PII lc = find(l), rc = find(r);
int lp = lc.first, rp = rc.first; // rp ++
int ld = lc.second - 1, rd = rc.second - 1;
int ans = INF;
if (lp == rp) {
rep(i, ld, rd - 1) ans = min(ans, abs(v[ld][i] - v[ld][i + 1]));
return ans;
}
if (ld != v[lp].size() - 1) rep(i, ld, v[lp].size() - 2) ans = min(ans, abs(v[lp][i] - v[lp][i + 1]));
if (rd != 0) rep(j, 1, rd) ans = min(ans, abs(v[rp][j] - v[rp][j - 1]));
ans = min(ans, abs(v[lp].back() - v[lp + 1].front()));
ans = min(ans, abs(v[rp].front() - v[rp - 1].back()));
rep(k, lp + 1, rp - 1) {
ans = min(ans, res[k].dmin), ans = min(ans, v[k].front() - v[k - 1].back());
ans = min(ans, v[k].back() - v[k + 1].front());
}
return ans;
}
int main() {
scanf("%d%d", &n, &m); S = (int)sqrt(n);
v.emplace_back();
for (int i = 1; i <= n; i ++ ) {
int w; scanf("%d", &w);
if (i % S == 0)
v.emplace_back();
v.back().emplace_back(w);
}
rop(i, 0, v.size()) res.emplace_back(rebuild(i));
while (m -- ) {
char op[7]; int a, b;
scanf("%s%d%d", op, &a, &b);
if (*op == 'i') insert(a, b);
else if (op[1] == 'e') merge(a, b);
else if (op[1] == 'a') printf("%d\n", query_max(a, b) - query_min(a, b));
else printf("%d\n", query_d(a, b));
}
return 0;
}