Submission #1171581

#TimeUsernameProblemLanguageResultExecution timeMemory
1171581hamzabcRMQ (NOI17_rmq)C++20
100 / 100
58 ms53300 KiB
#include <bits/stdc++.h> using namespace std; #define all(x) x.begin(), x.end() #define mod 1000000007 #define sp << " " << #define endl << '\n' int N, Q; class Tree{ public: vector<int> commoncontainer; struct dat{ int say0 = 1; int l; int r; dat* lft; dat* rgt; }; void copy(dat* root1, dat* root2){ // root2 = root1 root2->l = root1->l; root2->r = root1->r; root2->lft = root1->lft; root2->rgt = root1->rgt; root2->say0 = root1->say0; } private: void _init(dat* root, int l, int r){ root->l = l; root->r = r; if (l == r) return; root->rgt = new dat; root->lft = new dat; int m = (l + r) >> 1; _init(root->lft, l, m); _init(root->rgt, m + 1, r); root->say0 = root->lft->say0 + root->rgt->say0; } void _update(int l, int r, dat* root){ if (l <= root->l && root->r <= r){ root->say0 = 0; return; } if (root->say0 == 0) return; if (root->lft->r >= l){ dat* eski = root->lft; root->lft = new dat; copy(eski, root->lft); _update(l, r, root->lft); } if (root->rgt->l <= r){ dat* eski = root->rgt; root->rgt = new dat; copy(eski, root->rgt); _update(l, r, root->rgt); } root->say0 = root->lft->say0 + root->rgt->say0; } int _first0(int l, int r, dat* root, int s){ if (commoncontainer[s] >= root->say0) return -1; if (root->l == root->r){ commoncontainer[s]++; return root->l; } if (root->lft->r >= l && root->lft->say0 - commoncontainer[(s << 1)]){ int k = _first0(l, r, root->lft, s << 1); if (k != -1){ commoncontainer[s]++; return k; } } if (root->rgt->l <= r && root->rgt->say0 - commoncontainer[(s << 1) | 1]){ int k = _first0(l, r, root->rgt, (s << 1) | 1); if (k != -1){ commoncontainer[s]++; return k; } } return -1; } public: void init(int size, dat* root){ commoncontainer.resize(size * 4); _init(root, 0, size); } void update(int l, int r, dat* root){ _update(l, r, root); } int findleft0(dat* root, int l, int r){ return _first0(l, r, root, 1); } }; int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); cin >> N >> Q; Tree tre; vector<vector<array<int, 2>>> querys(N); vector<Tree::dat*> roots(N); for (int i = 0; i < Q; i++){ int a, b, c; cin >> a >> b >> c; querys[c].push_back({ a, b }); } roots[N - 1] = new Tree::dat; tre.init(N, roots[N - 1]); for (int i = N - 2; i >= 0; i--){ roots[i] = new Tree::dat; tre.copy(roots[i + 1], roots[i]); for (auto j : querys[i + 1]){ tre.update(j[0], j[1], roots[i]); } } vector<int> ret(N); for (int i = 0; i < N; i++){ int l = 0, r = N - 1; for (auto o : querys[i]){ l = max(l, o[0]); r = min(r, o[1]); } int k = tre.findleft0(roots[i], l, r); if (r < l || k == -1){ for (int j = 0; j < N; j++){ cout << -1 sp ""; } return 0; } ret[k] = i; } for (auto u : ret){ cout << u sp ""; } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...