Submission #1145432

#TimeUsernameProblemLanguageResultExecution timeMemory
1145432tntTrampoline (info1cup20_trampoline)C++20
42 / 100
2104 ms555404 KiB
#include <bits/stdc++.h> using namespace std; //#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native") //#pragma GCC optimize("Ofast,unroll-loops,fast-math,O3") #define pb push_back #define ll long long #define int long long #define all(v) v.begin(),v.end() int mod = 998244353; const int N = 2e5 + 10; const int inf = 1e9; int fact[200001]; ll binpow(ll a, ll b){ if(b == 0) return 1; else if(b % 2 == 1) return (a * binpow(a, b - 1)) % mod; ll p = binpow(a,b / 2); return (p * p) % mod; } int was[N],up[N][20]; vector <int> ord, v,sx,sy; vector <int> g[N]; int x[N],y[N],x1[N],y2[N]; vector <pair <int,int> > mp[N]; void dfs(int u){ for(int to : g[u]){ if(was[to] == 1) continue; dfs(to); } ord.push_back(u); } bool func(int u, int l1, int r1){ int k = l1 - x1[u] - 1; for(int i = 19; i >= 0; i--){ if (k >> i & 1) u = up[u][i]; } if(x1[u] == l1 - 1 && y2[u] <= r1){ return true; } else return false; } signed main(){ //freopen("mootube.in", "r", stdin); //freopen("mootube.out", "w", stdout); int r,c,n; cin >> r >> c >> n; for(int i = 1; i <= n; i++){ cin >> x[i] >> y[i]; sx.push_back(x[i]); sy.push_back(y[i]); x1[i] = x[i]; y2[i] = y[i]; } sort(all(sx)), sort(all(sy)); sx.erase(unique(all(sx)), sx.end()); sy.erase(unique(all(sy)), sy.end()); for (int i = 1; i <= n; i++) { x[i] = lower_bound(all(sx), x[i]) - sx.begin(); y[i] = lower_bound(all(sy), y[i]) - sy.begin(); mp[x[i]].push_back({y[i], i}); } for(int i = 0; i < N; i++) sort(all(mp[i])); for(int i = 1;i <= n; i++){ int it = lower_bound(all(mp[x[i] + 1]), make_pair(y[i],0ll)) - mp[x[i] + 1].begin(); if(it == mp[x[i] + 1].size() || x1[mp[x[i] + 1][it].second] - x1[i] != 1) continue; g[i].pb(mp[x[i] + 1][it].second); } for(int i = 1; i <= n; i++){ if(was[i] != 1){ dfs(i); } } for (int x: ord) { if (!g[x].size()) { for (int k = 0; k < 20; k++) { up[x][k] = x; } continue; } up[x][0] = g[x][0]; for(int i = 1; i < 20; i++) up[x][i] = up[up[x][i - 1]][i - 1]; } int t; cin >> t; while(t--){ int l,r,l1,r1; cin >> l >> r >> l1 >> r1; if(r > r1){ cout << "No\n"; continue; } if(l1 == l){ cout << "Yes\n"; continue; } int it = lower_bound(all(sx),l) - sx.begin(); if(it == sx.size() || l != sx[it]){ cout << "No\n"; continue; } r = lower_bound(all(sy), r) - sy.begin(); int pos = lower_bound(all(mp[it]),make_pair(r,0ll)) - mp[it].begin(); if (pos == mp[it].size()) { cout << "No\n"; continue; } if(func(mp[it][pos].second,l1,r1)) cout << "Yes\n"; else cout << "No\n"; } }
#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...