Submission #976050

#TimeUsernameProblemLanguageResultExecution timeMemory
976050Double_SlashQueue (CEOI06_queue)C++17
88 / 100
218 ms37864 KiB
#include <bits/stdc++.h> #define debug(x) [&]() { auto _x = x; cerr << __LINE__ << ": " << #x << " = " << _x << endl; }() using namespace std; typedef pair<int, int> pint; const int INF = 1e9; int n, q; struct Block { int l, r; int sum = 0; Block *lc = nullptr, *rc = nullptr; }; int main() { cin >> n; vector<pint> swaps(n); set<int> used; for (auto &[a, b]: swaps) { cin >> a >> b; used.emplace(a); used.emplace(b); } int last = 1; auto root = new Block{1, 0}; auto join = [] (Block *a, Block *b) { if (a) a->rc = b; if (b) b->lc = a; }; map<int, Block*> m; auto ptr = root; auto add = [&] (int l, int r) { join(ptr, m[r] = new Block{l, r}); ptr = ptr->rc; }; for (int x: used) { if (x > last) add(last, x - 1); add(x, x); last = x + 1; } if (last <= INF) add(last, INF); for (auto [a, b]: swaps) { auto blocka = m[a], blockb = m[b]; join(blocka->lc, blocka->rc); join(blockb->lc, blocka); join(blocka, blockb); } vector<Block> arr; for (; root->rc; root = root->rc) { root->rc->sum = root->sum + root->r - root->l + 1; arr.push_back(*root->rc); } cin >> q; while (q--) { char c; int x; cin >> c >> x; if (c == 'P') { auto b = used.count(x) ? m[x] : m[*used.upper_bound(x) - 1]; cout << b->sum + x - b->l + 1 << endl; } else { int i = 0; for (int j = 20; --j >= 0;) { if (i + (1 << j) < arr.size()) { if (arr[i + (1 << j)].sum < x) i += 1 << j; } } cout << arr[i].l + x - arr[i].sum - 1 << endl; } } }

Compilation message (stderr)

queue.cpp: In function 'int main()':
queue.cpp:64:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<Block>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   64 |                 if (i + (1 << j) < arr.size()) {
      |                     ~~~~~~~~~~~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...