Submission #106731

#TimeUsernameProblemLanguageResultExecution timeMemory
106731eriksuenderhaufExamination (JOI19_examination)C++11
100 / 100
2286 ms385712 KiB
//#pragma GCC optimize("O3") #include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #include <ext/pb_ds/tree_policy.hpp> #define mem(a,v) memset((a), (v), sizeof (a)) #define enl printf("\n") #define case(t) printf("Case #%d: ", (t)) #define ni(n) scanf("%d", &(n)) #define nl(n) scanf("%lld", &(n)) #define nai(a, n) for (int i = 0; i < (n); i++) ni(a[i]) #define nal(a, n) for (int i = 0; i < (n); i++) nl(a[i]) #define pri(n) printf("%d\n", (n)) #define prl(n) printf("%lld\n", (n)) #define pii pair<int, int> #define pil pair<int, long long> #define pll pair<long long, long long> #define vii vector<pii> #define vil vector<pil> #define vll vector<pll> #define vi vector<int> #define vl vector<long long> #define pb emplace_back #define mp make_pair #define fi first #define se second using namespace std; using namespace __gnu_pbds; typedef long long ll; typedef cc_hash_table<int,int,hash<int>> ht; typedef tree<int,null_type,less<int>,rb_tree_tag,tree_order_statistics_node_update> oset; const double pi = acos(-1); const int MOD = 1e9 + 7; const ll INF = 1e16 + 7; const int MAXN = 4e5 + 5; const double eps = 1e-9; pii a[MAXN]; struct nodeX { vector<vi> seg; vi arr, sm; } seg[MAXN]; void build(int l, int r, int k, int k2, vi &sm) { if (l == r) { seg[k2].seg[k] = {sm[l]}; return; } int m = (l + r) / 2; build(l, m, k*2, k2, sm); build(m+1, r, k*2+1, k2, sm); int i = 0, j = 0; while (i < (int)seg[k2].seg[k*2].size() && j < (int)seg[k2].seg[k*2+1].size()) if (seg[k2].seg[k*2][i] < seg[k2].seg[k*2+1][j]) seg[k2].seg[k].pb(seg[k2].seg[k*2][i++]); else seg[k2].seg[k].pb(seg[k2].seg[k*2+1][j++]); while (i < (int)seg[k2].seg[k*2].size()) seg[k2].seg[k].pb(seg[k2].seg[k*2][i++]); while (j < (int)seg[k2].seg[k*2+1].size()) seg[k2].seg[k].pb(seg[k2].seg[k*2+1][j++]); } void build(int l, int r, int k) { if (l == r) { seg[k].arr = {a[l].se}; seg[k].sm = {a[l].fi + a[l].se}; seg[k].seg.resize(2); build(0, 0, 1, k, seg[k].sm); return; } seg[k].seg.resize(4*(r-l+1)+1); int m = (l + r) / 2; build(l, m, k * 2); build(m + 1, r, k * 2 + 1); int i = 0, j = 0; while (i < (int)seg[k*2].arr.size() && j < (int)seg[k*2+1].arr.size()) { if (seg[k*2].arr[i] < seg[k*2+1].arr[j]) { seg[k].arr.pb(seg[k*2].arr[i]); seg[k].sm.pb(seg[k*2].sm[i++]); } else { seg[k].arr.pb(seg[k*2+1].arr[j]); seg[k].sm.pb(seg[k*2+1].sm[j++]); } } while (i < (int)seg[k*2].arr.size()) { seg[k].arr.pb(seg[k*2].arr[i]); seg[k].sm.pb(seg[k*2].sm[i++]); } while (j < (int)seg[k*2+1].arr.size()) { seg[k].arr.pb(seg[k*2+1].arr[j]); seg[k].sm.pb(seg[k*2+1].sm[j++]); } build(0, r - l, 1, k, seg[k].sm); } int qry1(int l, int r, int k, int k2, int a, int b, int z) { if (r < a || b < l) return 0; if (a <= l && r <= b) { /*cout << "print seg2:" << l << " " << r << "\n"; for (int i: seg[k2].seg[k]) cout << i << " "; cout << "\n";*/ int lo = lower_bound(seg[k2].seg[k].begin(), seg[k2].seg[k].end(), z) - seg[k2].seg[k].begin(); //cout << lo << " " << " ret " << (int)seg[k2].seg[k].size() - lo + 1 << "\n"; return (int)seg[k2].seg[k].size() - lo; } int m = (l + r) / 2; return qry1(l, m, k*2, k2, a, b, z) + qry1(m+1, r, k*2+1, k2, a, b, z); } int qry(int l, int r, int k, int a, int b, int y, int z) { if (r < a || b < l) return 0; if (a <= l && r <= b) { /*cout << "print:" << l << " " << r << "\n"; for (int i: seg[k].arr) cout << i << " "; cout << "\n"; for (int i: seg[k].sm) cout << i << " "; cout << "\n";*/ int lo = lower_bound(seg[k].arr.begin(), seg[k].arr.end(), y) - seg[k].arr.begin(); //cout << lo << "\n"; return qry1(0, r - l, 1, k, lo, r - l, z); } int m = (l + r) / 2; return qry(l, m, k*2, a, b, y, z) + qry(m + 1, r, k*2+1, a, b, y, z); } int main() { int n, q; scanf("%d %d", &n, &q); for (int i = 0; i < n; i++) scanf("%d %d", &a[i].fi, &a[i].se); sort(a, a + n); /*for (int i = 0; i < n; i++) cout << a[i].fi << " : " << a[i].se << "\n";*/ build(0, n - 1, 1); for (int i = 0; i < q; i++) { int x, y, z; scanf("%d %d %d", &x, &y, &z); int lo = lower_bound(a, a + n, mp(x, -1)) - a; //cout << lo << "\n"; pri(qry(0, n - 1, 1, lo, n - 1, y, z)); } return 0; }

Compilation message (stderr)

examination.cpp: In function 'int main()':
examination.cpp:131:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d %d", &n, &q);
  ~~~~~^~~~~~~~~~~~~~~~~
examination.cpp:133:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", &a[i].fi, &a[i].se);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~
examination.cpp:140:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d %d", &x, &y, &z);
   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...