Submission #1145098

#TimeUsernameProblemLanguageResultExecution timeMemory
1145098PragmatismTrampoline (info1cup20_trampoline)C++20
0 / 100
725 ms66624 KiB
#include <bits/stdc++.h>
//
#pragma comment(linker, "/stack:200000000")
//
#pragma GCC optimize("Ofast")
//
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,avx2,tune=native")

#define pb push_back
#define pii pair <int, int>
#define ll long long
#define ld long double
#define x first
#define y second
#define all(v) v.begin(),v.end()
#define sz(s) (int)s.size()
#define skip continue

using namespace std;

const int N = 4e5 + 7;
const int inf = 1e9 + 7;
const ll INF = 1e18 + 7;

//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

//#define int ll

int n, m, k;

void f(vector <pii> &v) {
    vector <int> vx, vy;
    for (auto p : v)vx.pb(p.x), vy.pb(p.y);
    sort(all(vx)), sort(all(vy));

    map <int, int> id;
    int last = -inf, pos = 0;
    for (auto x : vx) {
        if (x == last)skip;
        id[x] = ++pos, last = x;
    }
    for (auto &p : v)p.x = id[p.x];

    last = -inf, pos = 0, id.clear();
    for (auto y : vy) {
        if (y == last)skip;
        id[y] = ++pos, last = y;
    }
    for (auto &p : v)p.y = id[p.y];
}

int sz, cnt[N], root[N], t[60 * N], L[60 * N], R[60 * N];
int build(int tl, int tr) {
    int v = ++sz;
    if (tl == tr) {
        t[v] = cnt[tl];
        return v;
    }
    int mid = (tl + tr) / 2;
    L[v] = build(tl, mid), R[v] = build(mid + 1, tr);
    t[v] = t[L[v]] + t[R[v]];
    return v;
}
int get(int v, int tl, int tr, int l, int r) {
    if (r < l || tr < l || tl > r)return 0;
    if (tl >= l && tr <= r)return t[v];
    int mid = (tl + tr) / 2;
    return get(L[v], tl, mid, l, r) + get(R[v], mid + 1, tr, l, r);
}
int update(int v, int tl, int tr, int pos) {
    int nv = ++sz;
    t[nv] = t[v], L[nv] = L[v], R[nv] = R[v];
    if (tl == tr) {
        t[nv]--;
        return nv;
    }
    int mid = (tl + tr) / 2;
    if (pos <= mid)L[nv] = update(L[nv], tl, mid, pos);
    else R[nv] = update(R[nv], mid + 1, tr, pos);
    t[nv] = t[L[nv]] + t[R[nv]];
    return nv;
}

struct query {
    pii s, f;
    int id;
    bool operator < (query const &other) const {
        return s.x < other.s.x;
    }
};
void solve() {
    cin >> n >> m >> k;
    set <pii> st;
    vector <pii> v;
    for (int i = 1;i <= k;i++) {
        int x, y;
        cin >> x >> y;
        v.pb({x, y});
    }
    int q;
    cin >> q;
    vector <int> dif(q);
    for (int i = 0;i < q;i++) {
        pii s, f;
        cin >> s.x >> s.y >> f.x >> f.y;
        v.pb(s), v.pb(f);
        dif[i] = max(0, f.x - s.x);
    }
    f(v);
    vector <query> vq;
    for (int i = 0;i < (sz(v) - k) / 2;i++) {
        pii s, f;
        s = v[k + 2 * i], f = v[k + 2 * i + 1];
        vq.pb({s, f, i});
    }

    for (int i = 0;i < k;i++)st.insert({v[i].x, v[i].y}), cnt[v[i].y]++;
    sort(all(vq));
    vector <bool> ans(q, 0);
    root[0] = build(1, N - 7);
    vector <int> inv(q + 1, 0);
    for (int i = 0;i < q;i++) {
        pii s = vq[i].s, f = vq[i].f;
        int id = vq[i].id;
        inv[id] = i;
        int last = root[max(0, i - 1)];
        while (!st.empty() && (*st.begin()).x < s.x) {
            pii p = *st.begin();
            st.erase(p), last = update(last, 1, N - 7, p.y);
        }
        root[i] = last;
        if (s.x > f.x || s.y > f.y) {
            ans[id] = -1;
            skip;
        }
        ans[id] = get(1, 1, N - 7, s.y, f.y);
    }

    reverse(all(vq));
    st.clear();
    for (int i = 0;i < k;i++)st.insert({v[i].x, v[i].y});
    //for (int i = 0;i < q;i++)
    //for (int i = 0;i < q;i++)cout << (ans[i] ? "Yes" : "No") << '\n';
}
signed main() {
    //srand(time(NULL));
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int test = 1;
    //cin >> test;
    for (int t = 1;t <= test;t++)solve();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...