This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
// Success consists of going from failure to failure without loss of enthusiasm
#include <bits/stdc++.h>
using namespace std;
#define nl '\n'
#define f first
#define s second
#define mp make_pair
#define pb push_back
#define sz(x) int(x.size())
template<class T> using V = vector<T>;
template<class T> using uset = unordered_set<T>;
template<class T, size_t SZ> using AR = array<T, SZ>;
using vi = V<int>;
using pi = pair<int, int>;
using vpi = V<pi>;
const int INF = 1e9;
int N, D; vi H;
struct ST {
int N; V<vi> X; V<vpi> E; V<V<vi>> adj;
void init(int n) {
N = 1; while(N < n) N *= 2;
X.assign(2*N, {});
E.assign(2*N, {});
adj.assign(2*N, {});
}
void add(int l, int r, pi e, int x, int L, int R) {
if (r < L || R < l) return;
if (l <= L && R <= r) { E[x].pb(e); return; }
int M = (L + R) / 2;
add(l, r, e, 2 * x, L, M);
add(l, r, e, 2 * x + 1, M + 1, R);
}
void build() {
for(int i = 1; i < 2 * N; i++) {
for(auto& e : E[i]) {
X[i].pb(e.f); X[i].pb(e.s);
}
sort(begin(X[i]), end(X[i])); X[i].erase(unique(begin(X[i]), end(X[i])), end(X[i]));
int K = sz(X[i]);
adj[i] = V<vi>(K);
while(sz(E[i])) {
int u, v; tie(u, v) = E[i].back(); E[i].pop_back();
u = lower_bound(begin(X[i]), end(X[i]), u) - begin(X[i]);
v = lower_bound(begin(X[i]), end(X[i]), v) - begin(X[i]);
adj[i][u].pb(v);
adj[i][v].pb(u);
}
}
}
void query(int d, int p, vi& F, int x, int L, int R) {
int px = lower_bound(begin(X[x]), end(X[x]), p) - begin(X[x]);
if (px < sz(X[x]) && X[x][px] == p) {
for(auto& nx : adj[x][px]) {
// cout << L << " " << R << " => " << X[x][nx] << endl;
F.pb(X[x][nx]);
}
}
if (L == R) return;
int M = (L + R) / 2;
if (d <= M) query(d, p, F, 2 * x, L, M);
else query(d, p, F, 2 * x + 1, M + 1, R);
}
void add(int l, int r, pi e) { add(l, r, e, 1, 0, N - 1); }
void query(int d, int p, vi& F) { query(d, p, F, 1, 0, N - 1); }
} st;
void init(int n, int d, int h[]) {
N = n, D = d; H.resize(N);
for(int i = 0; i < N; i++) H[i] = h[i];
}
void curseChanges(int U, int A[], int B[]) {
st.init(U);
map<pi, int> C;
for(int i = 0; i < U; i++) {
if (A[i] < B[i]) swap(A[i], B[i]);
pi e = mp(A[i], B[i]);
if (C.find(e) == C.end()) C[e] = i;
else {
// cout << C[e] << " " << i - 1 << " => " << e.f << " " << e.s << endl;
st.add(C[e], i - 1, e);
C.erase(e);
}
}
for(auto& p : C) {
st.add(p.s, U - 1, p.f);
// cout << p.s << " " << U - 1 << " => " << p.f.f << " " << p.f.s << endl;
}
st.build();
}
int question(int x, int y, int v) {
--v;
vi FX, FY;
// cout << "x: ";
st.query(v, x, FX);
// cout << endl;
// cout << "y: ";
st.query(v, y, FY);
// cout << endl;
vpi C;
// cout << "X: ";
for(auto& c : FX) {
C.pb(mp(H[c], 0));
// cout << c << " ";
}
// cout << nl;
// cout << "Y: ";
for(auto& c : FY) {
C.pb(mp(H[c], 1));
// cout << c << " ";
}
// cout << nl;
sort(begin(C), end(C));
int ans = INF;
for(int i = 0; i + 1 < sz(C); i++) if (C[i].s != C[i + 1].s) ans = min(ans, abs(C[i].f - C[i + 1].f));
return ans;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |