제출 #1327933

#제출 시각아이디문제언어결과실행 시간메모리
1327933DeltaStruct새 집 (APIO18_new_home)C++20
57 / 100
5099 ms309200 KiB
#include <bits/stdc++.h>
using namespace std;

signed main(){
  ios::sync_with_stdio(false),cin.tie(0);
  int n,m,q; cin >> n >> m >> q; vector<tuple<int,int,int,int>> A(n);
  for (auto& [a,b,c,d]:A) (cin >> a >> b >> c >> d),--a,--b,--c;
  vector<multiset<int>> M(m);
  vector<pair<int,int>> QQ(q); vector<int> R(q),Z;
  for (auto& [a,b]:QQ) (cin>>b>>a),--a,Z.emplace_back(--b);
  sort(Z.begin(),Z.end()),Z.erase(unique(Z.begin(),Z.end()),Z.end());
  int s = Z.size();
  for (auto& [a,b]:QQ) b = lower_bound(Z.begin(),Z.end(),b)-Z.begin();
  vector Q = QQ; sort(Q.begin(),Q.end());
  vector<array<priority_queue<int>,4>> segtree(2*s);
  auto edit = [&](int l,int r,int a,int d) -> void {
    int b = (a==-1?r:-l),c = 2*(a==-1);
    int ll = lower_bound(Z.begin(),Z.end(),l)-Z.begin();
    int rr = lower_bound(Z.begin(),Z.end(),r)-Z.begin();
    for (ll+=s,rr+=s;ll < rr;ll>>=1,rr>>=1){
      if (ll&1) segtree[ll++][c+(d==-1)].emplace(b);
      if (rr&1) segtree[--rr][c+(d==-1)].emplace(b);
    }
  };
  auto del = [&](int i,auto it,int d = -1) -> void {
    if (M[i].empty()) return;
    if (M[i].begin()==it) return edit(0,*it,-1,d);
    if (M[i].end()==it) return edit(*prev(it),1e8,1,d);
    int mid = (*it+*prev(it)+1)/2;
    return edit(*prev(it),mid,1,d),edit(mid,*it,-1,d);
  };
  auto add = [&](int i,auto it) -> void {
    del(i,it,1);
  };
  int emp = m;
  multiset<pair<int,int>> E;
  for (int i(0);i < n;++i) E.emplace(get<2>(A[i]),i),E.emplace(get<3>(A[i]),i);
  auto query = [&](array<priority_queue<int>,4>& M,int x) -> int {
    while(!M[1].empty()&&M[0].top()==M[1].top()) M[0].pop(),M[1].pop();
    while(!M[3].empty()&&M[2].top()==M[3].top()) M[2].pop(),M[3].pop();
    int ret = 0;
    if (!M[0].empty()) ret = max(ret,M[0].top()+x);
    if (!M[2].empty()) ret = max(ret,M[2].top()-x);
    return ret;
  };
  for (int i(0);auto [a,b]:Q){
    while(!E.empty()&&E.begin()->first<=a){
      auto [c,k] = *E.begin(); E.erase(E.begin());
      int x = get<1>(A[k]),y = get<0>(A[k]);
      auto it = M[x].upper_bound(y);
      if (get<2>(A[k])==c) emp-=M[x].empty(),del(x,it),add(x,M[x].emplace_hint(it,y)),add(x,it);
      else del(x,prev(it)),del(x,it),add(x,M[x].erase(prev(it))),emp+=M[x].empty();
    }
    if (emp) R[i] = -1;
    else for (int l(s+b);l;l>>=1) R[i] = max(R[i],query(segtree[l],Z[b]));
    ++i;
  }
  for (auto& a:QQ) cout << R[lower_bound(Q.begin(),Q.end(),a)-Q.begin()] << '\n';
}
#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...