제출 #879511

#제출 시각아이디문제언어결과실행 시간메모리
879511TheSahibSegments (IZhO18_segments)C++17
컴파일 에러
0 ms0 KiB
#include <bits/stdc++.h> #define ll long long #define pii pair<int, int> #define all(v) v.begin(), v.end() using namespace std; const int oo = 2e9 + 1e8; const int MAX = 2e5 + 5; const int BLOCK = 3000; const int D = 128; pii arr[MAX]; int nxt = 1; vector<pii> v; struct DATA{ vector<int> a; vector<int> b; }; DATA combine(DATA& a, DATA& b){ DATA c; c.a.resize(a.a.size() + b.a.size()); c.b.resize(a.b.size() + b.b.size()); merge(all(a.a), all(b.a), c.a.begin()); merge(all(a.b), all(b.b), c.b.begin()); return c; } DATA tree[MAX * 2]; void build(int node, int l, int r){ tree[node].a.clear(); tree[node].b.clear(); if(l == r){ tree[node].a = {v[l].second}; tree[node].b = {v[l].second - v[l].first + 1}; return; } int mid = (l + r) / 2; if(mid - l + 1 < D){ for(int i = l; i <= r;++i){ tree[node].a.push_back(v[i].second); tree[node].a.push_back(v[i].second - v[i].first + 1); sort(all(tree[node].a)); sort(all(tree[node].b)); } return; } build(node + 1, l, mid); build(node + (mid - l + 1) * 2, mid + 1, r); if(tree[node + 1].a.size()){ tree[node] = combine(tree[node + 1], tree[node + (mid - l + 1) * 2]); } } int ask1(int node, int l, int r, int ql, int qr, int val){ if(ql > r || qr < l) return 0; if(f({ql, qr}, {l, r}) <= D){ int ans = 0; for(int i = max(ql, l); i <= min(qr, r); ++i){ ans += (v[i].second >= val); } return ans; } if(ql <= l && r <= qr){ auto itr = lower_bound(all(tree[node].a), val); return (tree[node].a.end() - itr); } int mid = (l + r) / 2; return ask1(node + 1, l, mid, ql, qr, val) + ask1(node + (mid - l + 1) * 2, mid + 1, r, ql, qr, val); } int ask2(int node, int l, int r, int ql, int qr, int val){ if(ql > r || qr < l) return 0; if(f({ql, qr}, {l, r}) <= D){ int ans = 0; for(int i = max(ql, l); i <= min(qr, r); ++i){ ans += (v[i].second - v[i].first + 1 >= val); } return ans; } if(ql <= l && r <= qr){ auto itr = lower_bound(all(tree[node].b), val); return (tree[node].b.end() - itr); } int mid = (l + r) / 2; return ask2(node + 1, l, mid, ql, qr, val) + ask2(node + (mid - l + 1) * 2, mid + 1, r, ql, qr, val); } vector<pii> b1; vector<pii> b2; void update(){ for (int i = 0; i < v.size() * 2; i++) { tree[i].a.clear(); tree[i].a.shrink_to_fit(); tree[i].b.clear(); tree[i].b.shrink_to_fit(); } v.clear(); b1.clear(); b2.clear(); for (int i = 1; i < nxt; i++) { if(arr[i].first == -1) continue; v.push_back(arr[i]); } cout << '\n'; sort(all(v)); build(0, 0, v.size() - 1); } int f(pii a, pii b){ int ans = min(a.second, b.second) - max(a.first, b.first) + 1; if(ans <= 0) return 0; return ans; } void solve(){ int n, o; cin >> n >> o; int lastAns = 0; while(n--){ int t; cin >> t; if(t == 1){ int a, b; cin >> a >> b; a = a ^ (o * lastAns); b = b ^ (o * lastAns); if(a > b) swap(a, b); arr[nxt++] = {a, b}; b1.push_back({a, b}); } else if(t == 2){ int id; cin >> id; b2.push_back(arr[id]); arr[id] = {-1, -1}; } else{ int a, b, c; cin >> a >> b >> c; a = a ^ (o * lastAns); b = b ^ (o * lastAns); if(a > b) swap(a, b); if(b - a + 1 < c){ lastAns = 0; cout << 0 << '\n'; continue; } if(b1.size() + b2.size() > BLOCK){ update(); } int ans = 0; if(v.size() != 0){ int i = lower_bound(all(v), make_pair(a, -1)) - v.begin(); if(i > 0){ ans += ask1(0, 0, v.size() - 1, 0, i - 1, a + c - 1); } int j = upper_bound(all(v), make_pair(b - c + 1, oo)) - v.begin(); if(j > 0 && i <= j - 1){ ans += ask2(0, 0, v.size() - 1, i, j - 1, c); } } for(auto p:b1){ ans += (f(p, {a, b}) >= c); } for(auto p:b2){ ans -= (f(p, {a, b}) >= c); } lastAns = ans; cout << ans << '\n'; } } } /* 6 1 1 1 2 3 2 4 2 1 3 5 3 2 3 1 2 1 3 0 3 1 */ /* 6 0 1 3 10 1 3 5 3 6 10 6 2 1 1 3 10 3 6 4 2 */ int main() { solve(); }

컴파일 시 표준 에러 (stderr) 메시지

segments.cpp: In function 'int ask1(int, int, int, int, int, int)':
segments.cpp:61:8: error: 'f' was not declared in this scope
   61 |     if(f({ql, qr}, {l, r}) <= D){
      |        ^
segments.cpp: In function 'int ask2(int, int, int, int, int, int)':
segments.cpp:77:8: error: 'f' was not declared in this scope
   77 |     if(f({ql, qr}, {l, r}) <= D){
      |        ^
segments.cpp: In function 'void update()':
segments.cpp:96:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   96 |     for (int i = 0; i < v.size() * 2; i++)
      |                     ~~^~~~~~~~~~~~~~