Submission #1168519

#TimeUsernameProblemLanguageResultExecution timeMemory
1168519thinknoexitExamination (JOI19_examination)C++20
100 / 100
1479 ms154084 KiB
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template <typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
const int N = 100100;
struct A {
    int s, t;
    bool operator < (const A& o) const {
        return s + t < o.s + o.t;
    }
} a[N];
struct Q {
    int x, y, z, i;
    bool operator < (const Q& o) const {
        if (x != o.x) return x > o.x;
        return i < o.i;
    }
};
int sum[N];
vector<Q> v;
int ans[N], n;
ordered_set<pair<int, int>> seg_tree[4 * N];
void update(int v, int w, int now = 1, int l = 1, int r = n) {
    seg_tree[now].insert({ w, v });
    if (l == r) return;
    int mid = (l + r) / 2;
    if (v <= mid) update(v, w, 2 * now, l, mid);
    else update(v, w, 2 * now + 1, mid + 1, r);
}
int query(int ql, int qr, int w, int now = 1, int l = 1, int r = n) {
    if (ql <= l && r <= qr) {
        int ans = (int)seg_tree[now].size()
            - seg_tree[now].order_of_key(pair<int, int>(w, 0));
        return ans;
    }
    int mid = (l + r) / 2;
    if (qr <= mid) return query(ql, qr, w, 2 * now, l, mid);
    if (ql > mid) return query(ql, qr, w, 2 * now + 1, mid + 1, r);
    return query(ql, qr, w, 2 * now, l, mid) + query(ql, qr, w, 2 * now + 1, mid + 1, r);
}
int main() {
    cin.tie(nullptr)->sync_with_stdio(false);
    int q;
    cin >> n >> q;
    for (int i = 1;i <= n;i++) {
        cin >> a[i].s >> a[i].t;
    }
    sort(a + 1, a + 1 + n);
    for (int i = 1;i <= n;i++) {
        sum[i] = a[i].s + a[i].t;
    }
    for (int i = 1;i <= n;i++) {
        v.push_back({ a[i].s, i, -1, -1 });
    }
    for (int i = 1;i <= q;i++) {
        int x, y, z;
        cin >> x >> y >> z;
        v.push_back({ x, y, z, i });
    }
    sort(v.begin(), v.end());
    for (auto& x : v) {
        if (x.i == -1) {
            update(x.y, a[x.y].t);
            continue;
        }
        int idx = lower_bound(sum + 1, sum + 1 + n, x.z) - sum;
        if (idx == n + 1) continue;
        ans[x.i] = query(idx, n, x.y);
    }
    for (int i = 1;i <= q;i++) {
        cout << ans[i] << '\n';
    }
    return 0;
}
/*
80 3 -1 -1
70 5 -1 -1
60 60 80 3
45 1 -1 -1
35 4 -1 -1
20 2 -1 -1
20 50 120 1
10 10 100 2
0 100 100 4
*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...