Submission #797453

#TimeUsernameProblemLanguageResultExecution timeMemory
797453kingfran1907Segments (IZhO18_segments)C++14
0 / 100
178 ms53680 KiB
#include <bits/stdc++.h> #define X first #define Y second using namespace std; typedef long long llint; const llint off = 1LL << 32; const int maxn = 2e5+10; struct node { int val; node *l, *r; node() { val = 0; l = r = nullptr; } }; typedef node* pnode; int value(pnode tren) { if (tren == nullptr) return 0; return tren->val; } pnode L(pnode tren) { if (tren == nullptr) return nullptr; return tren->l; } pnode R(pnode tren) { if (tren == nullptr) return nullptr; return tren->r; } int n, t; set< int > s; pnode lef, rig; pair<llint, llint> niz[maxn]; void update(llint x, llint l, llint r, pnode tren, int val) { //printf("update: %lld %lld %lld %d %d\n", x, l, r, tren, val); if (x < l || x > r) return; if (l == r) { tren->val += val; return; } int mid = (l + r) / 2; if (x <= mid) { if (tren->l == nullptr) tren->l = new node(); update(x, l, mid, tren->l, val); } else { if (tren->r == nullptr) tren->r = new node(); update(x, mid + 1, r, tren->r, val); } tren->val = value(tren->l) + value(tren->r); } int query(llint a, llint b, llint l, llint r, pnode node) { if (l > b || r < a) return 0; if (node == nullptr) return 0; if (l >= a && r <= b) return value(node); int mid = (l + r) / 2; return query(a, b, l, mid, node->l) + query(a, b, mid + 1, r, node->r); } int main() { scanf("%d%d", &n, &t); for (int i = 1; i <= n + 2; i++) s.insert(i); //printf("off: %lld\n", off); int lastans = 0; lef = new node(); rig = new node(); int cnt = 0; while (n--) { int type; scanf("%d", &type); if (type == 1) { llint l, r; scanf("%lld%lld", &l, &r); l = l ^ (t * lastans); r = r ^ (t * lastans); if (l > r) swap(l, r); int ind = *s.begin(); s.erase(s.begin()); cnt++; update(r, 0, off - 1, lef, 1); update(l, 0, off - 1, rig, 1); niz[ind] = {l, r}; } else if (type == 2) { int id; scanf("%d", &id); llint l = niz[id].X, r = niz[id].Y; update(r, 0, off - 1, lef, -1); update(l, 0, off - 1, rig, -1); s.insert(id); cnt--; } else { llint l, r, k; scanf("%lld%lld%lld", &l, &r, &k); l = l ^ (t * lastans); l--; r = r ^ (t * lastans); r++; if (l > r) swap(l, r); lastans = cnt; lastans -= query(0, l, 0, off - 1, lef); lastans -= query(r, off - 1, 0, off - 1, rig); printf("%d\n", lastans); } } return 0; }

Compilation message (stderr)

segments.cpp: In function 'int main()':
segments.cpp:70:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   70 |  scanf("%d%d", &n, &t);
      |  ~~~~~^~~~~~~~~~~~~~~~
segments.cpp:81:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   81 |   scanf("%d", &type);
      |   ~~~~~^~~~~~~~~~~~~
segments.cpp:84:9: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   84 |    scanf("%lld%lld", &l, &r);
      |    ~~~~~^~~~~~~~~~~~~~~~~~~~
segments.cpp:97:9: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   97 |    scanf("%d", &id);
      |    ~~~~~^~~~~~~~~~~
segments.cpp:105:9: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
  105 |    scanf("%lld%lld%lld", &l, &r, &k);
      |    ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...