Submission #1104848

#TimeUsernameProblemLanguageResultExecution timeMemory
1104848abushbandit_Trampoline (info1cup20_trampoline)C++17
57 / 100
894 ms111660 KiB
#pragma GCC target("avx,avx2,fma") #pragma GCC optimize("Ofast,unroll-loops") #include "bits/stdc++.h" using namespace std; //~ #ifndef ONLINE_JUDGE //~ #include "debug.h" //~ #else //~ #define debug(...) //~ #define debugArr(...) //~ #endif #define int long long #define all(x) x.begin(),x.end() #define rall(x) x.rbegin(),x.rend() #define ff first #define ss second #define pb push_back template<class T, class U> inline bool chmin(T& a, const U& b) { if (a > b) { a = b; return true; } return false; } template<class T, class U> inline bool chmax(T& a, const U& b) { if (a < b) { a = b; return true; } return false; } const int inf = 1e9; const int mod = 1e9 + 7; const int N = 1e5 + 5; void solve() { int r,c,n; cin >> r >> c >> n; int a[n],b[n]; vector<pair<int,int>> v; map<int,vector<pair<int,int>>> mp; set<int> st; for(int i = 0;i < n;i++) { cin >> a[i] >> b[i]; v.pb({a[i],b[i]}); st.insert(a[i]); } sort(all(v)); reverse(all(v)); int id = 0; vector<vector<pair<int,int>>> up(n,vector<pair<int,int>> (20,{-1,-1})); vector<int> pr(n,-1); for(auto [i,j] : v) { mp[i].pb({j,id++}); } for(auto i : st) sort(all(mp[i])); id = 0; int last = -1; for(auto [i,j] : v) { if(mp.find(i + 1) == mp.end()) { last = i; id++; continue; } int lst = pr[id - 1] - 1; if(pr[id - 1] == -1 || last != i) lst = mp[i + 1].size() - 1; while(lst >= 0 && mp[i + 1][lst].ff >= j) { lst--; } lst++; pr[id] = lst; if(lst == (int)mp[i + 1].size()) continue; up[id][0] = {mp[i + 1][lst]}; for(int k = 1;k < 20;k++) { if(up[id][k - 1].ss == -1) break; up[id][k] = {up[up[id][k - 1].ss][k - 1]}; //~ if(last == i) { //~ if(up[id - 1][k].ff < up[id][k].ff) { //~ up[id - 1][k] = up[id][k]; //~ } //~ } } id++; last = i; } auto get = [&](int a,int k) -> int { int val = inf; for(int i = 0;i < 20;i++) { if(k >> i & 1) { val = up[a][i].ff; a = up[a][i].ss; if(a == -1) { return -1; } } } return val; }; int q; cin >> q; while(q--) { int xs,ys,xf,yf; cin >> xs >> ys >> xf >> yf; if(xs == xf && ys <= yf) { cout << "Yes\n"; continue; } else if(xs == xf) { cout << "No\n"; continue; } int ans = -1,l = 0,r = mp[xs].size() - 1; while(l <= r) { int mid = l + (r - l) / 2; if(mp[xs][mid].ff >= ys) { r = mid - 1; ans = mid; } else { l = mid + 1; } } if(ans == -1 || xf < xs) { cout << "No\n"; } else { int x; if(xf - xs == 1) { x = mp[xs][ans].ff; } else { x = get(mp[xs][ans].ss,xf - xs - 1); } assert(x != inf); if(x <= yf && x != -1) { cout << "Yes\n"; } else { cout << "No\n"; } } } } signed main() { ios_base::sync_with_stdio(false); cin.tie(nullptr);cout.tie(nullptr); int t = 1; //~ cin >> t; while(t--) { solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...