Submission #1110753

#TimeUsernameProblemLanguageResultExecution timeMemory
1110753anmattroiExamination (JOI19_examination)C++14
100 / 100
417 ms57180 KiB
#include <bits/stdc++.h> #define maxn 100005 #define fi first #define se second using namespace std; using ii = pair<int, int>; int n, q; int itone[22*maxn], ittwo[22*maxn], Lone[22*maxn], Ltwo[22*maxn], Rone[22*maxn], Rtwo[22*maxn]; int rootone[maxn], roottwo[maxn], ntone = 0, nttwo = 0; int buildone(int lo = 1, int hi = n) { if (lo == hi) return ++ntone; int cur = ++ntone, mid = (lo + hi) >> 1; Lone[cur] = buildone(lo, mid); Rone[cur] = buildone(mid+1, hi); return cur; } int buildtwo(int lo = 1, int hi = n) { if (lo == hi) return ++nttwo; int cur = ++nttwo, mid = (lo + hi) >> 1; Ltwo[cur] = buildtwo(lo, mid); Rtwo[cur] = buildtwo(mid+1, hi); return cur; } int updone(int u, int oldver, int lo = 1, int hi = n) { if (lo == hi) { itone[++ntone] = itone[oldver] + 1; return ntone; } int cur = ++ntone, mid = (lo + hi) >> 1; if (u <= mid) { Lone[cur] = updone(u, Lone[oldver], lo, mid); Rone[cur] = Rone[oldver]; } else { Lone[cur] = Lone[oldver]; Rone[cur] = updone(u, Rone[oldver], mid+1, hi); } itone[cur] = itone[Lone[cur]] + itone[Rone[cur]]; return cur; } int updtwo(int u, int oldver, int lo = 1, int hi = n) { if (lo == hi) { ittwo[++nttwo] = ittwo[oldver] + 1; return nttwo; } int cur = ++nttwo, mid = (lo + hi) >> 1; if (u <= mid) { Ltwo[cur] = updtwo(u, Ltwo[oldver], lo, mid); Rtwo[cur] = Rtwo[oldver]; } else { Ltwo[cur] = Ltwo[oldver]; Rtwo[cur] = updtwo(u, Rtwo[oldver], mid+1, hi); } ittwo[cur] = ittwo[Ltwo[cur]] + ittwo[Rtwo[cur]]; return cur; } int getone(int u, int v, int r, int lo = 1, int hi = n) { if (u > hi || v < lo) return 0; if (u <= lo && hi <= v) return itone[r]; int mid = (lo + hi) >> 1; return getone(u, v, Lone[r], lo, mid) + getone(u, v, Rone[r], mid+1, hi); } int gettwo(int u, int v, int r, int lo = 1, int hi = n) { if (u > hi || v < lo) return 0; if (u <= lo && hi <= v) return ittwo[r]; int mid = (lo + hi) >> 1; return gettwo(u, v, Ltwo[r], lo, mid) + gettwo(u, v, Rtwo[r], mid+1, hi); } ii a[maxn]; int b[maxn], c[maxn]; int main() { ios::sync_with_stdio(false); cin.tie(NULL); cin >> n >> q; for (int i = 1; i <= n; i++) { cin >> a[i].fi >> a[i].se; b[i] = a[i].se; c[i] = a[i].fi + a[i].se; } sort(b + 1, b + n + 1); sort(c + 1, c + n + 1); sort(a + 1, a + n + 1); rootone[0] = buildone(); roottwo[0] = buildtwo(); for (int i = 1; i <= n; i++) { int p1 = lower_bound(b + 1, b + n + 1, a[i].se) - b, p2 = lower_bound(c + 1, c + n + 1, a[i].fi+a[i].se) - c; rootone[i] = updone(p1, rootone[i-1]); roottwo[i] = updtwo(p2, roottwo[i-1]); } auto solve = [&]() -> void { int x, y, z; cin >> x >> y >> z; int L1 = lower_bound(a + 1, a + n + 1, ii{x, 0}) - a; if (L1 > n) { cout << "0\n"; return; } int lo = L1-1, hi = n+1; while (hi - lo > 1) { int mid = (lo + hi) >> 1; if (a[mid].fi + y >= z) hi = mid; else lo = mid; } int p1 = lower_bound(b + 1, b + n + 1, y) - b, p2 = lower_bound(c + 1, c + n + 1, z) - c; int ans = 0; if (p2 <= n) ans += gettwo(p2, n, roottwo[lo]) - gettwo(p2, n, roottwo[L1-1]); if (p1 <= n) ans += getone(p1, n, rootone[n]) - getone(p1, n, rootone[lo]); cout << ans << "\n"; }; while (q--) solve(); } /* 5 4 20 95 35 100 45 15 70 70 80 40 20 50 120 10 10 100 60 60 80 0 100 100 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...