Submission #868926

#TimeUsernameProblemLanguageResultExecution timeMemory
868926mgl_diamondMatryoshka (JOI16_matryoshka)C++17
100 / 100
326 ms26540 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using ii = pair<int, int>; template<class T> using vec = vector<T>; #define foru(i, l, r) for(int i=(l); i<=(r); ++i) #define ford(i, l, r) for(int i=(l); i>=(r); --i) #define fore(x, v) for(auto &x : v) #define all(x) (x).begin(), (x).end() #define sz(x) (int)(x).size() #define fi first #define se second #define file "input" void setIO(string name="") { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); if (fopen(file".in", "r")) { freopen(file".in", "r", stdin); freopen(file".out", "w", stdout); } } const int N = 2e5+5; int n, m, ft[N], dp[N], fst[N*4], ret[N]; vector<int> comp; ii a[N]; void modify(int i, int v) { for(i=n-i+1; i<=n; i+=i&-i) ft[i] = max(ft[i], v); } int query(int i) { int ans = 0; for(i=n-i+1; i>=1; i-=i&-i) ans = max(ans, ft[i]); return ans; } int main() { setIO(); cin >> n >> m; foru(i, 1, n) { cin >> a[i].fi >> a[i].se; comp.push_back(a[i].fi); comp.push_back(a[i].se); } vector<pair<ii, int>> querys; foru(i, 1, m) { int d, h; cin >> d >> h; querys.push_back({{h, d}, i}); comp.push_back(d); comp.push_back(h); } sort(all(comp)); comp.resize(unique(all(comp)) - comp.begin()); foru(i, 1, n) { a[i].fi = upper_bound(all(comp), a[i].fi) - comp.begin(); a[i].se = upper_bound(all(comp), a[i].se) - comp.begin(); } fore(x, querys) { x.fi.fi = upper_bound(all(comp), x.fi.fi) - comp.begin(); x.fi.se = upper_bound(all(comp), x.fi.se) - comp.begin(); } sort(a+1, a+n+1, [&](ii a, ii b){ return a.fi < b.fi || (a.fi == b.fi && a.se > b.se); }); vector<int> lis; vector<ii> updates; ford(i, n, 1) { int it = upper_bound(all(lis), a[i].se) - lis.begin(); if (it == sz(lis)) lis.push_back(a[i].se); else lis[it] = a[i].se; fst[a[i].fi] = i; dp[i] = it+1; updates.emplace_back(a[i].se, i); } fst[sz(comp)+1] = n+1; ford(i, sz(comp), 1) if (fst[i] == 0) fst[i] = fst[i+1]; sort(all(querys)); sort(all(updates)); int j = 0, k = 0; foru(i, 1, sz(comp)) { while (j < sz(updates) && updates[j].fi <= i) { int p = updates[j].se; modify(p, dp[p]); ++j; } while (k < sz(querys) && querys[k].fi.fi <= i) { int p = fst[querys[k].fi.se]; ret[querys[k].se] = query(p); ++k; } } foru(i, 1, m) { cout << ret[i] << "\n"; } }

Compilation message (stderr)

matryoshka.cpp: In function 'void setIO(std::string)':
matryoshka.cpp:20:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   20 |     freopen(file".in", "r", stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
matryoshka.cpp:21:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   21 |     freopen(file".out", "w", stdout);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...