#include "seats.h"
#include <bits/stdc++.h>
using namespace std;
#ifdef LOCAL
#include "/home/fv3/prog/debug/debug.h"
#else
#define debug(...) 42
#endif
struct segtree {
int nt = 1;
vector<int> mn, cnt, add;
void init(int N, vector<int> &a, vector<int> &p) {
while (nt < N) {
nt <<= 1;
}
mn = vector<int>(2*nt);
cnt = vector<int>(2*nt, 1);
add = vector<int>(2*nt);
mn[nt] = 2;
for (int i = 1; i < N; i++) {
mn[nt+i] = mn[nt+i-1];
if (a[p[i]-1] < i) {
mn[nt+i]--;
} else {
mn[nt+i]++;
}
if (a[p[i]+1] < i) {
mn[nt+i]--;
} else {
mn[nt+i]++;
}
}
for (int i = nt-1; i >= 1; i--) {
merge(i, i*2, i*2|1);
}
}
void prop(int k) {
mn[k] += add[k];
if (k < nt) {
add[k*2] += add[k];
add[k*2|1] += add[k];
}
add[k] = 0;
}
void update(int l, int r, int k, int tl, int tr, int val) {
prop(k);
if (tl > r || tr < l) return;
if (tl >= l && tr <= r) {
add[k] += val;
prop(k);
return;
}
int c = (tl + tr) / 2;
update(l, r, k*2, tl, c, val);
update(l, r, k*2|1, c+1, tr, val);
merge(k, k*2, k*2|1);
}
void merge(int i, int c1, int c2) {
if (mn[c1] == mn[c2]) {
cnt[i] = cnt[c1] + cnt[c2];
} else if (mn[c1] < mn[c2]) {
cnt[i] = cnt[c1];
} else {
cnt[i] = cnt[c2];
}
mn[i] = min(mn[c1], mn[c2]);
}
};
vector<vector<int>> m;
vector<int> a, pos;
int N;
segtree st;
void give_initial_chart(int H_, int W_, vector<int> R_, vector<int> C_) {
N = W_; // H = 1
a = vector<int>(N+2, N);
for (int i = 0; i < N; i++) {
a[C_[i]+1] = i;
}
pos = C_;
for (auto &e : pos) {
e++;
}
debug(a, pos);
st.init(N, a, pos);
}
int swap_seats(int u, int v) {
// TODO: Handle case where u and v are adjacent
if (a[pos[u]-1] < u) {
st.update(a[pos[u]-1], u-1, 1, 0, st.nt-1, -1);
} else {
st.update(u, a[pos[u]-1]-1, 1, 0, st.nt-1, -1);
}
if (a[pos[u]+1] < u) {
st.update(a[pos[u]+1], u-1, 1, 0, st.nt-1, -1);
} else {
st.update(u, a[pos[u]+1]-1, 1, 0, st.nt-1, -1);
}
if (a[pos[v]-1] < v) {
st.update(a[pos[v]-1], v-1, 1, 0, st.nt-1, -1);
} else {
st.update(v, a[pos[v]-1]-1, 1, 0, st.nt-1, -1);
}
if (a[pos[v]+1] < v) {
st.update(a[pos[v]+1], v-1, 1, 0, st.nt-1, -1);
} else {
st.update(v, a[pos[v]+1]-1, 1, 0, st.nt-1, -1);
}
swap(a[pos[u]], a[pos[v]]);
swap(pos[u], pos[v]);
if (a[pos[u]-1] < u) {
st.update(a[pos[u]-1], u-1, 1, 0, st.nt-1, 1);
} else {
st.update(u, a[pos[u]-1]-1, 1, 0, st.nt-1, 1);
}
if (a[pos[u]+1] < u) {
st.update(a[pos[u]+1], u-1, 1, 0, st.nt-1, 1);
} else {
st.update(u, a[pos[u]+1]-1, 1, 0, st.nt-1, 1);
}
if (a[pos[v]-1] < v) {
st.update(a[pos[v]-1], v-1, 1, 0, st.nt-1, 1);
} else {
st.update(v, a[pos[v]-1]-1, 1, 0, st.nt-1, 1);
}
if (a[pos[v]+1] < v) {
st.update(a[pos[v]+1], v-1, 1, 0, st.nt-1, 1);
} else {
st.update(v, a[pos[v]+1]-1, 1, 0, st.nt-1, 1);
}
debug(a);
return st.mn[1] == 2 ? st.cnt[1] : 0;
}
# | 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... |