Submission #1248308

#TimeUsernameProblemLanguageResultExecution timeMemory
1248308nh0902Examination (JOI19_examination)C++20
0 / 100
465 ms12212 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long

const int N = 1e5 + 10;

const int M = 1e5 + 10;

const int inf = 1e18;

int n, q, x[2 * N], y[2 * N], z[2 * N], ans[N];

void compress(int *p, int m) {
    vector<pair<int, int>> v;
    for (int i = 1; i <= m; i ++) {
        v.push_back({p[i], i});
    }
    sort(v.begin(), v.end());
    p[v[0].second] = 1;
    for (int i = 1; i < m; i ++) {
        p[v[i].second] = p[v[i - 1].second];
        if (v[i].first > v[i - 1].first) p[v[i].second] ++;
    }
}

void prep() {
    cin >> n >> q;
    for (int i = 1; i <= n; i ++) {
        cin >> x[i] >> y[i];
        z[i] = x[i] + y[i];
    }
    for (int i = 1; i <= q; i ++) {
        cin >> x[i + n] >> y[i + n] >> z[i + n];
    }
    compress(x, n + q);
    compress(y, n + q);
    compress(z, n + q);
    //for (int i = 1; i <= n + q; i ++) cout << z[i] << " ";
    //cout << "\n";
}

int bit[2 * N];

int getSum(int p) {
    int idx = p, ans = 0;
    while (idx > 0) {
        ans += bit[idx];
        idx -= (idx & (-idx));
    }
    return ans;
}

void update(int u, int v) {
    int idx = u;
    while (idx <= n + q) {
        bit[idx] += v;
        idx += (idx & (-idx));
    }
}

int order[2 * N];

bool cmp(int a, int b) {
    return x[a] < x[b];
}

bool cmp2(int a, int b) {
    int i = order[a];
    int j = order[b];
    if (y[i] == y[j]) return z[i] > z[j];
    return y[i] > y[j];
}

void dvc(int l, int r) {
    if (l >= r) return;

    //cout << l << " ; " << r << "\n";

    int mid = (l + r) / 2;

    vector<int> v;
    for (int i = l; i <= r; i ++) v.push_back(i);
    sort(v.begin(), v.end(), cmp2);

    for (int i : v) {
        //cout << i << " " << order[i] << "\n";

        if (i > mid && order[i] <= n) update(z[order[i]], 1);
            //cout << order[i] << "\n";

        if (i <= mid && order[i] > n) {
            ans[order[i] - n] += getSum(n + q) - getSum(z[order[i]] - 1);
            //cout << order[i] << " " << n + q << " " << z[order[i]] - 1 << " " << getSum(n + q) << " " << getSum(z[order[i]] - 1) << "\n";
        }
    }

    for (int i : v) {
        if (i > mid && order[i] <= n) update(z[order[i]], - 1);
    }

    dvc(l, mid);
    dvc(mid + 1, r);
}

void solve() {
    for (int i = 1; i <= n + q; i ++) order[i] = i;
    sort(order + 1, order + n + q + 1, cmp);
    //for (int i = 1; i <= n + q; i ++) cout << order[i] << " " << x[order[i]] << " " << y[order[i]] << " " << z[order[i]] << "\n";
    dvc(1, n + q);
    for (int i = 1; i <= q; i ++) cout << ans[i] << "\n";
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    prep();
    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...