Submission #537925

#TimeUsernameProblemLanguageResultExecution timeMemory
537925davi_bartOsumnjičeni (COCI21_osumnjiceni)C++14
110 / 110
703 ms60296 KiB
#pragma GCC optimize("O3") #include <bits/stdc++.h> using namespace std; #define ll long long #define int ll #define fi first #define se second #define ld long double #define pb push_back mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int N, Q; vector<array<int, 2> > v; struct segment { const int dim = 1 << 19; struct node { int val, prop; node(int a = -1, int b = -1) { val = a; prop = b; } }; vector<node> s = vector<node>(2 * dim); void prop(int pos) { if (pos >= dim || s[pos].prop == -1) return; s[2 * pos].val = s[pos].prop; s[2 * pos].prop = s[pos].prop; s[2 * pos + 1].val = s[pos].prop; s[2 * pos + 1].prop = s[pos].prop; } void upd(int pos, int l, int r, int a, int b, int k) { prop(pos); if (r < a || l > b) return; if (a <= l && r <= b) { s[pos].val = k; s[pos].prop = k; return; } int m = (l + r) / 2; upd(2 * pos, l, m, a, b, k); upd(2 * pos + 1, m + 1, r, a, b, k); s[pos].val = max(s[2 * pos].val, s[2 * pos + 1].val); s[pos].prop = -1; } int query(int pos, int l, int r, int a, int b) { prop(pos); if (r < a || l > b) return -1; if (a <= l && r <= b) return s[pos].val; int m = (l + r) / 2; return max(query(2 * pos, l, m, a, b), query(2 * pos + 1, m + 1, r, a, b)); } void upd(int a, int b, int k) { upd(1, 0, dim - 1, a, b, k); } int query(int a, int b) { return query(1, 0, dim - 1, a, b); } } seg; int r[20][200010]; signed main() { ios::sync_with_stdio(false); cin.tie(0); cin >> N; vector<int> x; for (int i = 0; i < N; i++) { int a, b; cin >> a >> b; v.pb({a, b}); x.pb(a); x.pb(b); } sort(x.begin(), x.end()); x.resize(unique(x.begin(), x.end()) - x.begin()); for (int i = 0; i < N; i++) { v[i][0] = lower_bound(x.begin(), x.end(), v[i][0]) - x.begin(); v[i][1] = lower_bound(x.begin(), x.end(), v[i][1]) - x.begin(); } for (int i = 0; i < N; i++) { r[0][i] = seg.query(v[i][0], v[i][1]); seg.upd(v[i][0], v[i][1], i); if (i) r[0][i] = max(r[0][i], r[0][i - 1]); } for (int i = 1; i < 19; i++) { for (int j = 0; j < N; j++) { if (r[i - 1][j] == -1) r[i][j] = -1; else r[i][j] = r[i - 1][r[i - 1][j]]; } } cin >> Q; for (int i = 0; i < Q; i++) { int a, b; cin >> a >> b; a--; b--; int tot = 1; int pos = b; int q = 18; while (q >= 0) { if (r[q][pos] >= a) { tot += (1 << q); pos = r[q][pos]; } q--; } cout << tot << '\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...