#include "seats.h"
#include <bits/stdc++.h>
#define MAX 1000010
using namespace std;
typedef array<int, 2> pr;
typedef array<int, 3> tp;
tp tree[MAX * 4];
pr val[MAX], lazy[MAX * 4], A[MAX];
int H, W;
vector<vector<int>> arr;
tp merge(tp X, tp Y) {
    if (X[0] < Y[0])
        return X;
    else if (X[0] > Y[0])
        return Y;
    else if (X[1] < Y[1])
        return X;
    else if (X[1] > Y[1])
        return Y;
    return {X[0], X[1], X[2] + Y[2]};
}
void init(int n, int s, int e) {
    if (s == e)
        tree[n] = {A[s][0], A[s][1], 1};
    else {
        int m = s + e >> 1;
        init(n << 1, s, m), init(n << 1 | 1, m + 1, e);
        tree[n] = merge(tree[n << 1], tree[n << 1 | 1]);
    }
}
void lazy_propagate(int n, int s, int e) {
    if (lazy[n][0] == 0 && lazy[n][1] == 0)
        return;
    tree[n][0] += lazy[n][0], tree[n][1] += lazy[n][1];
    if (s != e) {
        lazy[n << 1][0] += lazy[n][0], lazy[n << 1][1] += lazy[n][1];
        lazy[n << 1 | 1][0] += lazy[n][0], lazy[n << 1 | 1][1] += lazy[n][1];
    }
    lazy[n][0] = lazy[n][1] = 0;
}
tp query(int n, int s, int e, int l, int r) {
    lazy_propagate(n, s, e);
    if (r < s || e < l)
        return {MAX, MAX, 0};
    else if (l <= s && e <= r)
        return tree[n];
    else {
        int m = s + e >> 1;
        return merge(
            query(n << 1, s, m, l, r),
            query(n << 1 | 1, m + 1, e, l, r));
    }
}
void update(int n, int s, int e, int l, int r, pr x) {
    lazy_propagate(n, s, e);
    if (r < s || e < l)
        return;
    else if (l <= s && e <= r) {
        lazy[n][0] += x[0], lazy[n][1] += x[1];
        lazy_propagate(n, s, e);
    } else {
        int m = s + e >> 1;
        update(n << 1, s, m, l, r, x), update(n << 1 | 1, m + 1, e, l, r, x);
        tree[n] = merge(tree[n << 1], tree[n << 1 | 1]);
    }
}
void upd(int x, int y, int v, bool seg = true) {
    vector<int> st;
    int X, Y;
    if (x < H && y < W)
        st.push_back(arr[x][y]);
    if (0 < x && y < W)
        st.push_back(arr[x - 1][y]);
    if (0 < y && x < H)
        st.push_back(arr[x][y - 1]);
    if (0 < x && 0 < y)
        st.push_back(arr[x - 1][y - 1]);
    sort(st.begin(), st.end());
    if (st.size() == 1)
        X = st[0], Y = H * W;
    else
        X = st[0], Y = st[1];
    if (seg)
        update(1, 0, H * W - 1, X, Y - 1, {v, 0});
    else
        A[X][0]++, A[Y][0]--;
    if (st.size() == 1)
        return;
    X = H * W, Y = H * W;
    if (st.size() >= 3)
        X = st[2], Y = st[3];
    if ((val[st[0]][0] - val[st[1]][0]) * (val[st[0]][1] - val[st[1]][1]) != 0)
        X = st[1];
    if (seg && X < Y)
        update(1, 0, H * W - 1, X, Y - 1, {0, v});
    else if (X < Y)
        A[X][1]++, A[Y][1]--;
}
void give_initial_chart(int h, int w, vector<int> R, vector<int> C) {
    H = h, W = w;
    arr.resize(H + 1, vector<int>(W + 1, 0));
    for (int i = 0; i < H * W; i++)
        val[i] = {R[i], C[i]}, arr[R[i]][C[i]] = i;
    for (int i = 0; i <= H; i++)
        for (int j = 0; j <= W; j++)
            upd(i, j, 1, false);
    for (int i = 1; i < H * W; i++)
        A[i][0] += A[i - 1][0], A[i][1] += A[i - 1][1];
    init(1, 0, H * W - 1);
}
int swap_seats(int a, int b) {
    vector<pr> st;
    st.push_back({val[a][0], val[a][1]}), st.push_back({val[a][0] + 1, val[a][1]}), st.push_back({val[a][0], val[a][1] + 1}), st.push_back({val[a][0] + 1, val[a][1] + 1});
    st.push_back({val[b][0], val[b][1]}), st.push_back({val[b][0] + 1, val[b][1]}), st.push_back({val[b][0], val[b][1] + 1}), st.push_back({val[b][0] + 1, val[b][1] + 1});
    sort(st.begin(), st.end()), st.erase(unique(st.begin(), st.end()), st.end());
    for (pr i : st)
        upd(i[0], i[1], -1);
    swap(val[a], val[b]), arr[val[a][0]][val[a][1]] = a, arr[val[b][0]][val[b][1]] = b;
    for (pr i : st)
        upd(i[0], i[1], 1);
    tp res = query(1, 0, H * W - 1, 0, H * W - 1);
    assert(res[1] >= 0);
    return res[2];
}
| # | 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... |