Submission #554574

#TimeUsernameProblemLanguageResultExecution timeMemory
554574nafis_shifatNew Home (APIO18_new_home)C++17
0 / 100
5097 ms131192 KiB
#include<bits/stdc++.h> #define ll long long #define pii pair<int,int> using namespace std; const int mxn=6e5+5; const int inf=1e9; const int MX = 3e5 + 1; struct segtree { int tree[4*mxn] = {}; void update(int node,int b,int e,int p,int v) { if(e < p || b > p)return; if(b == e) { tree[node] = v; return; } int mid=b+e>>1; int left=node<<1; int right=left|1; update(left,b,mid,p,v); update(right,mid+1,e,p,v); tree[node]=max(tree[left],tree[right]); } int query(int node, int b, int e, int l, int r) { if(e < l || b > r) return 0; if(b >= l && e <= r) return tree[node]; int mid = b + e >> 1; int left = node << 1; int right = left | 1; return max(query(left, b, mid, l, r), query(right, mid + 1, e , l, r)); } } st; int x[mxn]; int tp[mxn]; int a[mxn], b[mxn]; int p[mxn], y[mxn]; multiset<int> con[mxn]; vector<int> v; multiset<int> nxt[mxn]; int res[mxn]; void rmv(int p, int x) { nxt[p].erase(nxt[p].find(x)); if(!nxt[p].empty()) st.update(1, 1, MX, p, *nxt[p].rbegin()); else { st.update(1, 1, MX, p, inf); } } void add(int p, int x) { nxt[p].insert(x); st.update(1, 1, MX, p, *nxt[p].rbegin()); } int main() { int n, k, q; cin >> n >> k >> q; for(int i = 1; i <= k; i++) { x[i] = -inf + i; tp[i] = i; v.push_back(x[i]); con[tp[i]].insert(x[i]); con[tp[i]].insert(inf); nxt[i].insert(inf); st.update(1, 1, MX, i, inf); } vector<tuple<int,int,int>> ev; for(int i = k + 1; i <= n + k; i++) { scanf("%d%d%d%d", &x[i], &tp[i], &a[i], &b[i]); v.push_back(x[i]); ev.emplace_back(a[i], 0, i); ev.emplace_back(b[i], 2, i); } sort(v.begin(), v.end()); v.erase(unique(v.begin(), v.end()), v.end()); for(int i = 1; i <= q; i++) { scanf("%d %d", &p[i], &y[i]); ev.emplace_back(y[i], 1, i); } sort(ev.begin(), ev.end()); for(auto [pos, t, id] : ev) { if(t == 0) { auto tmp = con[tp[id]].lower_bound(x[id] + 1); auto lst = prev(tmp); int lp = lower_bound(v.begin(), v.end(), *lst) - v.begin() + 1; rmv(lp, *tmp); add(lp, x[id]); int cp = lower_bound(v.begin(), v.end(), x[id]) - v.begin() + 1; add(cp, *tmp); con[tp[id]].insert(x[id]); } else if(t == 2) { auto tmp = con[tp[id]].lower_bound(x[id]); auto lst = prev(tmp); auto to = next(tmp); int lp = lower_bound(v.begin(), v.end(), *lst) - v.begin() + 1; int cp = lower_bound(v.begin(), v.end(), x[id]) - v.begin() + 1; rmv(lp, x[id]); nxt[cp].clear(); st.update(1, 1, MX, cp, 0); add(lp, *to); con[tp[id]].erase(con[tp[id]].find(x[id])); } else { int lo = 0; int hi = (int) 1e8; int ans = -1; while(lo <= hi) { int mid = lo + hi >> 1; int pos = p[id] - mid; int d = lower_bound(v.begin(), v.end(), pos) - v.begin(); assert(v[d - 1] < pos); if(st.query(1, 1, MX, 1, d) <= p[id] + mid) { ans = mid; hi = mid - 1; } else { lo = mid + 1; } } res[id] = ans; } } for(int i = 1; i <= q; i++) printf("%d\n",res[i]); }

Compilation message (stderr)

new_home.cpp: In member function 'void segtree::update(int, int, int, int, int)':
new_home.cpp:17:12: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   17 |   int mid=b+e>>1;
      |           ~^~
new_home.cpp: In member function 'int segtree::query(int, int, int, int, int)':
new_home.cpp:30:15: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
   30 |   int mid = b + e >> 1;
      |             ~~^~~
new_home.cpp: In function 'int main()':
new_home.cpp:138:18: warning: suggest parentheses around '+' inside '>>' [-Wparentheses]
  138 |     int mid = lo + hi >> 1;
      |               ~~~^~~~
new_home.cpp:87:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   87 |   scanf("%d%d%d%d", &x[i], &tp[i], &a[i], &b[i]);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
new_home.cpp:99:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   99 |   scanf("%d %d", &p[i], &y[i]);
      |   ~~~~~^~~~~~~~~~~~~~~~~~~~~~~
#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...