Submission #1145038

#TimeUsernameProblemLanguageResultExecution timeMemory
1145038PragmatismTrampoline (info1cup20_trampoline)C++20
0 / 100
915 ms65120 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];
}
struct query {
    pii s, f;
    int id;
    bool operator < (query const &other) const {
        return s.x < other.s.x;
    }
};

int cnt[N], t[4 * N];
void build(int v, int tl, int tr) {
    if (tl == tr) {
        t[v] = cnt[tl];
        return;
    }
    int mid = (tl + tr) / 2;
    build(v * 2, tl, mid), build(v * 2 + 1, mid + 1, tr);
    t[v] = t[v * 2] + t[v * 2 + 1];
}
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(v * 2, tl, mid, l, r) + get(v * 2 + 1, mid + 1, tr, l, r);
}
void update(int v, int tl, int tr, int pos) {
    if (tl == tr) {
        t[v]--;
        return;
    }
    int mid = (tl + tr) / 2;
    if (pos <= mid)update(v * 2, tl, mid, pos);
    else update(v * 2 + 1, mid + 1, tr, pos);
    t[v] = t[v * 2] + t[v * 2 + 1];
}
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(0ll, 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));
    build(1, 1, N - 7);
    vector <bool> ans(q, 0);
    for (int i = 0;i < q;i++) {
        pii s = vq[i].s, f = vq[i].f;
        int id = vq[i].id;
        while (!st.empty() && (*st.begin()).x < s.x) {
            pii p = *st.begin();
            st.erase(p), update(1, 1, N - 7, s.y);
        }

        if (s.x > f.x || s.y > f.y) {
            ans[id] = 0;
            skip;
        }
        if (get(1, 1, N - 7, s.y, f.y) >= dif[id])ans[id] = 1;
        else ans[id] = 0;
    }
    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...