Submission #1297000

#TimeUsernameProblemLanguageResultExecution timeMemory
1297000chithanhnguyenExamination (JOI19_examination)C++20
100 / 100
207 ms28876 KiB
#include <bits/stdc++.h>
using namespace std;

#define int long long
#define S first
#define T second

const int MAXN = 2e5 + 5;
int n, q;
pair<int, int> a[MAXN];

void init() {
    cin >> n >> q;
    for (int i = 1; i <= n; ++i)
        cin >> a[i].S >> a[i].T;
}

namespace subtask1 {
    int query(int x, int y, int z) {
        int res = 0;
        for (int i = 1; i <= n; ++i) {
            if (a[i].S >= x && a[i].T >= y && a[i].S + a[i].T >= z)
                ++res;
        }

        return res;
    }

    void solve() {
        for (int queries = 1; queries <= q; ++queries) {
            int x, y, z;
            cin >> x >> y >> z;
            cout << query(x, y, z) << '\n';
        }
    }
}

namespace subtask2 {
    const int MAXA = 1e5 + 1;

    int fen[MAXA + 5], ans[MAXN];

    void update(int idx, int v) {
        for (int i = idx; i <= MAXA; i += i & -i)
            fen[i] += v;
    }

    int get(int idx) {
        int res = 0;
        for (int i = idx; i; i -= i & -i)
            res += fen[i];
        return res;
    }

    struct Data {
        int x, y, id, type;
    };

    void print(const Data& x) {
        cout << x.x << " " << x.y << " " << x.id << " " << x.type << "\n";
    }

    bool cmp(const Data& i, const Data& j) {
        if (i.x == j.x) {
            if (i.type != j.type) return (i.type < j.type);
            return (i.y > j.y);
        }
        return (i.x > j.x);
    }

    void solve() {
        vector<Data> data;
        for (int i = 1; i <= n; ++i) {
            data.push_back({a[i].S + 1, a[i].T + 1, i, 0});
        }

        for (int i = 1; i <= q; ++i) {
            int x, y, z; cin >> x >> y >> z;
            data.push_back({x + 1, y + 1, i, 1});
        }

        sort(data.begin(), data.end(), cmp);

        for (auto &v : data) {
            if (v.type == 0) {
                update(v.y, 1);
            } else {
                int res = get(MAXA) - get(v.y - 1);
                ans[v.id] = res;
            }
            //print(v);
        }

        for (int i = 1; i <= q; ++i) cout << ans[i] << "\n";
    }
}

namespace subtask3 {
    const int MAXA = 1e5 + 1;
    int fen1[MAXA + 5], fen2[MAXA + 5], ans[MAXN];

    void update1(int idx, int v) {
        for (int i = idx; i <= MAXA; i += i & -i)
            fen1[i] += v;
    }

    int get1(int idx) {
        int res = 0;
        for (int i = idx; i; i -= i & -i)
            res += fen1[i];
        return res;
    }

    void update2(int idx, int v) {
        for (int i = idx; i <= MAXA; i += i & -i)
            fen2[i] += v;
    }

    int get2(int idx) {
        int res = 0;
        for (int i = idx; i; i -= i & -i)
            res += fen2[i];
        return res;
    }

    struct Data {
        int x, y, z, id, type;
    };

    void print(const Data& x) {
        cout << x.x << " " << x.y << " " << x.z << " " << x.id << " " << x.type << "\n";
    }

    bool cmp(const Data& i, const Data& j) {
        if (i.z == j.z) {
            return (i.type < j.type);
        }
        return (i.z > j.z);
    }

    bool cmp2(const Data& i, const Data& j) {
        if (i.x == j.x) {
            if (i.type != j.type) return (i.type < j.type);
            return (i.y > j.y);
        }
        return (i.x > j.x);
    }

    void solve() {
        vector<Data> data, data2;
        for (int i = 1; i <= n; ++i) {
            data.push_back({a[i].S + 1, a[i].T + 1, a[i].S + a[i].T + 2, i, 0});
            data2.push_back({a[i].S + 1, a[i].T + 1, a[i].S + a[i].T + 2, i, 0});
        }

        for (int i = 1; i <= q; ++i) {
            int x, y, z; cin >> x >> y >> z;
            data.push_back({x + 1, y + 1, z + 2, i, 1});
            if (x + y > z) data2.push_back({x + 1, y + 1, z + 2, i, 1});
        }

        sort(data.begin(), data.end(), cmp);

        for (auto &v : data) {
            if (v.type == 0) {
                update1(v.x, 1);
                update2(v.y, 1);
            } else {
                if (v.x + v.y > v.z) continue;
                int total = get2(MAXA) - get2(v.y - 1);
                int out = get1(v.x - 1);
                ans[v.id] = total - out;
            }
        }

        //for (auto &v : data2) print(v);
        sort(data2.begin(), data2.end(), cmp2);

        memset(fen1, 0, sizeof fen1);
        for (auto &v : data2) {
            if (v.type == 0) {
                update1(v.y, 1);
            } else {
                int res = get1(MAXA) - get1(v.y - 1);
                ans[v.id] = res;
            }
        }

        for (int i = 1; i <= q; ++i) cout << ans[i] << "\n";
    }
}

namespace subtask4 {
    int fen1[MAXN], fen2[MAXN], ans[MAXN];

    vector<int> coordX, coordY;

    int compress(const vector<int>& vec, int x) {
        return lower_bound(vec.begin(), vec.end(), x) - vec.begin() + 1;
    }

    void update(int* fen, int idx, int v) {
        for (int i = idx; i < MAXN; i += i & -i)
            fen[i] += v;
    }

    int get(int* fen, int idx) {
        int res = 0;
        for (int i = idx; i; i -= i & -i)
            res += fen[i];
        return res;
    }

    struct Data {
        int x, y, z, id, type;
    };

    bool cmp(const Data& i, const Data& j) {
        if (i.z == j.z) return (i.type < j.type);
        return (i.z > j.z);
    }

    bool cmp2(const Data& i, const Data& j) {
        if (i.x == j.x) {
            if (i.type != j.type) return (i.type < j.type);
            return (i.y > j.y);
        }
        return (i.x > j.x);
    }

    void solve() {
        vector<Data> data, data2;
        vector<int> rawX, rawY;

        for (int i = 1; i <= n; ++i) {
            int x = a[i].S + 1, y = a[i].T + 1, z = a[i].S + a[i].T + 2;
            data.push_back({x, y, z, i, 0});
            data2.push_back({x, y, z, i, 0});
            rawX.push_back(x);
            rawY.push_back(y);
        }

        for (int i = 1; i <= q; ++i) {
            int x, y, z; cin >> x >> y >> z;
            int cx = x + 1, cy = y + 1, cz = z + 2;
            data.push_back({cx, cy, cz, i, 1});
            rawX.push_back(cx);
            rawY.push_back(cy);
            if (x + y > z)
                data2.push_back({cx, cy, cz, i, 1});
        }

        sort(rawX.begin(), rawX.end());
        rawX.erase(unique(rawX.begin(), rawX.end()), rawX.end());
        coordX = rawX;

        sort(rawY.begin(), rawY.end());
        rawY.erase(unique(rawY.begin(), rawY.end()), rawY.end());
        coordY = rawY;

        sort(data.begin(), data.end(), cmp);

        for (auto &v : data) {
            int cx = compress(coordX, v.x);
            int cy = compress(coordY, v.y);
            if (v.type == 0) {
                update(fen1, cx, 1);
                update(fen2, cy, 1);
            } else {
                if (v.x + v.y > v.z) continue;
                int total = get(fen2, MAXN - 1) - get(fen2, cy - 1);
                int out = get(fen1, cx - 1);
                ans[v.id] = total - out;
            }
        }

        memset(fen1, 0, sizeof fen1);

        sort(data2.begin(), data2.end(), cmp2);

        for (auto &v : data2) {
            int cy = compress(coordY, v.y);
            if (v.type == 0) {
                update(fen1, cy, 1);
            } else {
                int res = get(fen1, MAXN - 1) - get(fen1, cy - 1);
                ans[v.id] = res;
            }
        }

        for (int i = 1; i <= q; ++i)
            cout << ans[i] << "\n";
    }
}

signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(nullptr); cout.tie(nullptr);

    init();
    subtask4::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...