제출 #502231

#제출 시각아이디문제언어결과실행 시간메모리
502231JovanBOsumnjičeni (COCI21_osumnjiceni)C++17
110 / 110
315 ms28416 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; using ld = long double; const int N = 200000; const int LOG = 20; set <pair <int, int>> q; bool intersects(int l, int r){ if(q.empty()) return 0; auto x = q.lower_bound({l, -1}); if(x != q.end()){ if(x->first <= r) return 1; } if(x != q.begin()){ x--; if(x->second >= l) return 1; } return 0; } int sl[N+5], sr[N+5]; int gde[LOG+1][N+5]; int main(){ ios_base::sync_with_stdio(false), cin.tie(0); cout.precision(10); cout << fixed; int n; cin >> n; for(int i=1; i<=n; i++){ cin >> sl[i] >> sr[i]; } int j = n; for(int i=n; i>=1; i--){ while(intersects(sl[i], sr[i])){ q.erase({sl[j], sr[j]}); j--; } q.insert({sl[i], sr[i]}); gde[0][i] = j + 1; } gde[0][n+1] = n + 1; for(int j=1; j<=LOG; j++){ for(int i=1; i<=n+1; i++){ gde[j][i] = gde[j-1][gde[j-1][i]]; } } int qrs; cin >> qrs; while(qrs--){ int l, r; cin >> l >> r; r++; int res = 0; for(int j=LOG; j>=0; j--){ if(gde[j][l] < r) l = gde[j][l], res += (1 << j); } res++; cout << res << "\n"; } 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...