Submission #690892

#TimeUsernameProblemLanguageResultExecution timeMemory
690892andrei_iorgulescuTrampoline (info1cup20_trampoline)C++14
54 / 100
275 ms19028 KiB
#include <bits/stdc++.h> using namespace std; int r,c,n,t; pair<int,int>a[200005]; int nxt[200005][20]; int lg[200005]; void nxt0() { for (int i = 1; i <= n; i++) { int lin = a[i].first + 1,col = a[i].second; pair<int,int>pr = {lin,col}; int st = i + 1,pas = 1 << 17; while (pas != 0) { if (st + pas <= n and pr > a[st + pas]) st += pas; pas /= 2; } st++; if (st <= n and a[st].first == lin and a[st].second >= col) nxt[i][0] = st; } } void prec() { nxt0(); for (int i = 2; i <= 200000; i++) lg[i] = 1 + lg[i / 2]; for (int j = 1; j <= lg[n]; j++) { for (int i = 1; i <= n - (1 << j) + 1; i++) { int n1 = nxt[i][j - 1]; if (n1 == 0) nxt[i][j] = 0; else { int n2 = nxt[n1][j - 1]; nxt[i][j] = n2; } } } /*for (int j = 0; j <= lg[n]; j++) { for (int i = 1; i <= n - (1 << j) + 1; i++) cout << nxt[i][j] << ' '; cout << '\n'; }*/ } void jump(int x,int y) { int pas = 17; while (pas != -1) { if (nxt[x][pas] != 0 and a[nxt[x][pas]].first <= a[y].first and a[nxt[x][pas]].second <= a[y].second) x = nxt[x][pas]; pas--; } if (a[x].first == a[y].first and a[x].second <= a[y].second) cout << "Yes\n"; else cout << "No\n"; } void query(int xs,int ys,int xf,int yf) { if (xs > xf or ys > yf) { cout << "No\n"; return; } if (xs == xf) { cout << "Yes\n"; return; } int ts = 0,tf = 0; int pas = 1 << 17; pair<int,int>cp = {xs,ys}; while (pas != 0) { if (ts + pas <= n and a[ts + pas] < cp) ts += pas; pas /= 2; } ts++; if (ts <= n and a[ts].first == xs and a[ts].second >= ys) ts += 0; else ts = 0; xf--; pas = 1 << 17; cp = {xf,yf}; while (pas != 0) { if (tf + pas <= n and a[tf + pas] <= cp) tf += pas; pas /= 2; } if (tf != 0 and a[tf].first == xf and a[tf].second <= yf) tf += 0; else tf = 0; //cout << ts << ' ' << tf << '\n'; if (ts == 0 or tf == 0) { cout << "No\n"; return; } jump(ts,tf); } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> r >> c >> n; for (int i =1 ; i <= n; i++) cin >> a[i].first >> a[i].second; sort(a + 1,a + n + 1); prec(); cin >> t; for (int i =1 ; i <= t; i++) { int xs,ys,xf,yf; cin >> xs >> ys >> xf >> yf; query(xs,ys,xf,yf); } 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...
#Verdict Execution timeMemoryGrader output
Fetching results...