Submission #225976

#TimeUsernameProblemLanguageResultExecution timeMemory
225976emil_physmathSegments (IZhO18_segments)C++17
0 / 100
748 ms15480 KiB
#include <algorithm> #include <iostream> #include <stdio.h> #include <queue> #include <vector> #include <set> using namespace std; struct Inter { int l, r; }; bool operator<(const Inter& a, const Inter& b) { return a.r - a.l < b.r - b.l; } const int maxN = 200'000; const int bl = 800; vector<int> ls[maxN / bl], rs[maxN / bl]; int main() { int n, t; cin >> n >> t; int prevans = 0; vector<Inter> seg; vector<Inter> unProc; vector<int> unProcDel; int deleted = 0; while (n--) { int type, l, r, k, id; cin >> type; if (type == 1) { cin >> l >> r; l = (l ^ (t * prevans)); r = (r ^ (t * prevans)); if (l > r) swap(l, r); unProc.push_back({l, r}); if (unProc.size() + unProcDel.size() >= bl) { // Rebuild. vector<Inter> temp; temp.reserve(seg.size() + unProc.size() - unProcDel.size()); for (int i: unProcDel) seg[i] = {-1, -1}; unProcDel.clear(); deleted += unProcDel.size(); for (int i = 0; i < seg.size(); ++i) if (seg[i].l != -1) temp.push_back(seg[i]); seg.swap(temp); temp.clear(); sort(unProc.begin(), unProc.end()); merge(unProc.begin(), unProc.end(), seg.begin(), seg.end(), back_inserter(temp)); seg.swap(temp); unProc.clear(); for (int i = 0; i < seg.size(); ++i) { ls[i / bl].push_back(seg[i].l); rs[i / bl].push_back(seg[i].r); } } } else if (type == 2) { cin >> id; --id; id -= deleted; unProcDel.push_back(id); } else if (type == 3) { cin >> l >> r >> k; l = (l ^ (t * prevans)); r = (r ^ (t * prevans)); if (l > r) swap(l, r); int ans = 0; for (int i = 0; i < seg.size(); i += bl) { int e = min(i + bl - 1, (int)seg.size() - 1); if (seg[i].r - seg[i].l >= k - 1) { ans += e - i + 1; ans -= lower_bound(ls[i / bl].begin(), ls[i / bl].end(), l + k - 1) - ls[i / bl].begin(); ans -= rs[i / bl].end() - upper_bound(rs[i / bl].begin(), rs[i / bl].end(), r - (k - 1)); } else if (seg[e].r - seg[i].l >= k - 1) { while (min(seg[e].r, r) - max(seg[e].l, l) + 1 >= k) { ++ans; --e; } } } for (auto p: unProc) if (min(r, p.r) - max(l, p.l) + 1 >= k) ++ans; for (int i: unProcDel) { Inter p = (i < seg.size() ? seg[i] : unProc[i - seg.size()]); if (min(p.r, r) - max(p.l, l) + 1 >= k) --ans; } /*for (auto p: seg) if (p.first != -1 && p.second - p.first < k - 1) --ans; for (auto p: seg) if (p.first != -1 && p.second - p.first >= k - 1 && p.second < l + k - 1) --ans; for (auto p: seg) if (p.first != -1 && p.second - p.first >= k - 1 && r - (k - 1) < p.first) --ans;*/ cout << ans << '\n'; #ifdef MANSON cout << flush; #endif // MANSON prevans = ans; } } }

Compilation message (stderr)

segments.cpp: In function 'int main()':
segments.cpp:43:35: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 for (int i = 0; i < seg.size(); ++i)
                                 ~~^~~~~~~~~~~~
segments.cpp:51:35: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 for (int i = 0; i < seg.size(); ++i)
                                 ~~^~~~~~~~~~~~
segments.cpp:71:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for (int i = 0; i < seg.size(); i += bl)
                             ~~^~~~~~~~~~~~
segments.cpp:94:30: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
                 Inter p = (i < seg.size() ? seg[i] : unProc[i - seg.size()]);
                            ~~^~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...