Submission #777180

#TimeUsernameProblemLanguageResultExecution timeMemory
777180tvladm2009Examination (JOI19_examination)C++17
2 / 100
3076 ms41912 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = (int) 5e5 + 7; const int B = 317; int x[N], y[N], oldx[N], oldy[N], sum[N]; int n, q; struct Query { int a; int b; int c; int id; }; bool operator < (const Query &a, const Query &b) { return a.a / B < b.a / B || (a.a / B == b.a / B && a.b < b.b); } Query queries[N]; int sol[N]; vector<int> inds[2][N]; bool inside[N]; int aib[N], total = 0; void update(int x, int val) { for (int i = x; i < N; i += i & -i) { aib[i] += val; } } int query(int x) { int ret = 0; for (int i = x; i >= 1; i -= i & -i) { ret += aib[i]; } return ret; } void contract(int a, bool where) { for (auto &it : inds[where][a]) { if (inside[it] == false) { continue; } update(sum[it], -1); inside[it] = false; total--; } } void expand(int a, bool where, int least) { for (auto &it : inds[where][a]) { if (inside[it] == true) { continue; } int cur = (where == 0 ? y[it] : x[it]); if (cur >= least) { update(sum[it], +1); inside[it] = true; total++; } } } void Mo() { int a = N - 1, b = N - 1; for (int i = 1; i <= q; i++) { int qa = queries[i].a; int qb = queries[i].b; while (a > qa) { a--; expand(a, 0, b); } while (b > qb) { b--; expand(b, 1, a); } while (a < qa) { contract(a, 0); a++; } while (b < qb) { contract(b, 1); b++; } sol[queries[i].id] = total - query(queries[i].c - 1); } } signed main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); // freopen("input", "r", stdin); cin >> n >> q; for (int i = 1; i <= n; i++) { cin >> x[i] >> y[i]; } for (int i = 1; i <= q; i++) { cin >> queries[i].a >> queries[i].b >> queries[i].c; queries[i].id = i; } sort(queries + 1, queries + q + 1); Query bef = queries[1]; { /// normalizare vector<int> vals; map<int, int> mp; for (int i = 1; i <= n; i++) { vals.push_back(x[i] + y[i]); } for (int i = 1; i <= q; i++) { vals.push_back(queries[i].c); } sort(vals.begin(), vals.end()); int cnt = 0; for (auto &i : vals) { if (mp[i] == 0) { mp[i] = ++cnt; } } for (int i = 1; i <= n; i++) { sum[i] = mp[x[i] + y[i]]; } for (int i = 1; i <= q; i++) { queries[i].c = mp[queries[i].c]; } vals.clear(); mp.clear(); for (int i = 1; i <= n; i++) { vals.push_back(x[i]); vals.push_back(y[i]); } for (int i = 1; i <= q; i++) { vals.push_back(queries[i].a); vals.push_back(queries[i].b); } sort(vals.begin(), vals.end()); cnt = 0; for (auto &i : vals) { if (mp[i] == 0) { mp[i] = ++cnt; } } for (int i = 1; i <= n; i++) { oldx[i] = x[i]; oldy[i] = y[i]; x[i] = mp[x[i]]; y[i] = mp[y[i]]; } for (int i = 1; i <= q; i++) { queries[i].a = mp[queries[i].a]; queries[i].b = mp[queries[i].b]; } for (int i = 1; i <= n; i++) { inds[0][x[i]].push_back(i); inds[1][y[i]].push_back(i); } } Mo(); sol[queries[1].id] = 0; for (int i = 1; i <= n; i++) { if (oldx[i] >= bef.a && oldy[i] >= bef.b && oldx[i] + oldy[i] >= bef.c) { sol[queries[1].id]++; } } for (int i = 1; i <= q; i++) { cout << sol[i] << "\n"; } 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...