Submission #267075

#TimeUsernameProblemLanguageResultExecution timeMemory
267075ChrisTInterval Collection (CCO20_day2problem2)C++17
25 / 25
4700 ms218816 KiB
#include <bits/stdc++.h> using namespace std; struct node { int maxl, minr, ans; }; vector<node> seg; vector<multiset<int>> lp, rp; multiset<pair<int, int>> byl, byr; node combine(node a, node b) { node c; c.maxl=max(a.maxl, b.maxl); c.minr=min(a.minr, b.minr); c.ans=min(a.ans, b.ans); if(b.minr!=0x3f3f3f3f && a.maxl!=-0x3f3f3f3f) c.ans=min(c.ans, b.minr-a.maxl); return c; } void build(int idx, int begin, int end) { if(begin==end) seg[idx].maxl=-0x3f3f3f3f, seg[idx].minr=0x3f3f3f3f, seg[idx].ans=0x3f3f3f3f; else { int mid=(begin+end)/2; build(idx*2, begin, mid); build(idx*2+1, mid+1, end); seg[idx]=combine(seg[idx*2], seg[idx*2+1]); } } void update(int idx, int begin, int end, int x, node v) { if(x<begin || end<x) return; if(begin==end) seg[idx]=v; else { int mid=(begin+end)/2; update(idx*2, begin, mid, x, v); update(idx*2+1, mid+1, end, x, v); seg[idx]=combine(seg[idx*2], seg[idx*2+1]); } } void recalc(int x) { node n; if(lp[x].empty()) n.maxl=-0x3f3f3f3f; else n.maxl=*lp[x].rbegin(); if(rp[x].empty()) n.minr=0x3f3f3f3f; else n.minr=*rp[x].begin(); if(n.minr!=0x3f3f3f3f && n.maxl!=-0x3f3f3f3f) n.ans=n.minr-n.maxl; else n.ans=0x3f3f3f3f; update(1, 1, seg.size()/2, x, n); } int get_ans() { if(seg[1].ans>=0x3f3f3f3f) { int r=-byl.rbegin()->second; int l=-byr.begin()->second; return r-l; } return seg[1].ans; } void init(int n) { int lg=0; while((1<<lg)<n) lg++; seg.resize(1<<(lg+1)); lp.resize(n+1); rp.resize(n+1); build(1, 1, 1<<lg); } int add_interval(int l, int r) { byl.insert({l, -r}); byr.insert({r, -l}); lp[r].insert(l); rp[l].insert(r); recalc(l); recalc(r); return get_ans(); } int remove_interval(int l, int r) { byl.erase(byl.find({l, -r})); byr.erase(byr.find({r, -l})); lp[r].erase(lp[r].find(l)); rp[l].erase(rp[l].find(r)); recalc(l); recalc(r); return get_ans(); } int main() { int n, q; scanf("%d", &q); n = 1000000; init(n); for(int i=0; i<q; i++) { char t; int l, r; scanf(" %c%d%d", &t, &l, &r); if(t=='A') printf("%d\n", add_interval(l, r)); else printf("%d\n", remove_interval(l, r)); } return 0; }

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:118:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  118 |     scanf("%d", &q);
      |     ~~~~~^~~~~~~~~~
Main.cpp:125:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  125 |         scanf(" %c%d%d", &t, &l, &r);
      |         ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#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...