답안 #1100419

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1100419 2024-10-13T19:33:24 Z vladilius 새 집 (APIO18_new_home) C++17
5 / 100
734 ms 221984 KB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using pii = pair<int, int>;
#define pb push_back
#define ff first
#define ss second
#define arr3 array<int, 3>
const int inf = 1e8;
const int inff = inf + 1;
const int N = 3e5 + 2;

struct IT{
    struct node{
        int m1, m2, i, l, r;
        node(){
            l = r = 0;
            m1 = inff; m2 = 0;
        }
    };
    multiset<int> s1[N], s2[N];
    vector<node> all;
    int cc, cc1;
    void init(){
        all.pb(node());
        all.pb(node());
        cc = 1; cc1 = 0;
    }
    int nw(int tl, int tr){
        all.pb(node()); cc++;
        if (tl == tr){
            cc1++;
            all[cc].i = cc1;
        }
        return cc;
    }
    void recalc(int v){
        all[v].m1 = inff; all[v].m2 = 0;
        if (all[v].l){
            all[v].m1 = min(all[v].m1, all[all[v].l].m1);
            all[v].m2 = max(all[v].m2, all[all[v].l].m2);
        }
        if (all[v].r){
            all[v].m1 = min(all[v].m1, all[all[v].r].m1);
            all[v].m2 = max(all[v].m2, all[all[v].r].m2);
        }
    }
    void add(int v, int tl, int tr, int p, int x, bool t){
        if (tl == tr){
            if (t){
                s2[all[v].i].insert(x);
                all[v].m2 = max(all[v].m2, x);
            }
            else{
                s1[all[v].i].insert(x);
                all[v].m1 = min(all[v].m1, x);
            }
            return;
        }
        int tm = (tl + tr) / 2;
        if (p <= tm){
            if (!all[v].l) all[v].l = nw(tl, tm);
            add(all[v].l, tl, tm, p, x, t);
        }
        else {
            if (!all[v].r) all[v].r = nw(tm + 1, tr);
            add(all[v].r, tm + 1, tr, p, x, t);
        }
        recalc(v);
    }
    void add(int l, int r){
        if (l == 1){
            add(1, 1, inf, l, r + 1, 1);
            return;
        }
        if (r == inf){
            add(1, 1, inf, inf, l - 1, 0);
            return;
        }
        int m = (l + r) / 2;
        if (l <= m) add(1, 1, inf, m, l - 1, 0);
        if (m < r) add(1, 1, inf, m + 1, r + 1, 1);
    }
    void rem(int v, int tl, int tr, int p, int x, bool t){
        if (tl == tr){
            if (t){
                s2[all[v].i].erase(s2[all[v].i].find(x));
                all[v].m2 = s2[all[v].i].empty() ? 0 : *prev(s2[all[v].i].end());
            }
            else{
                s1[all[v].i].erase(s1[all[v].i].find(x));
                all[v].m1 = s1[all[v].i].empty() ? inff : *s1[all[v].i].begin();
            }
            return;
        }
        int tm = (tl + tr) / 2;
        if (p <= tm){
            rem(all[v].l, tl, tm, p, x, t);
        }
        else {
            rem(all[v].r, tm + 1, tr, p, x, t);
        }
        recalc(v);
    }
    void rem(int l, int r){
        if (l == 1){
            rem(1, 1, inf, l, r + 1, 1);
            return;
        }
        if (r == inf){
            rem(1, 1, inf, inf, l - 1, 0);
            return;
        }
        int m = (l + r) / 2;
        if (l <= m) rem(1, 1, inf, m, l - 1, 0);
        if (m < r) rem(1, 1, inf, m + 1, r + 1, 1);
    }
    int get(int v, int tl, int tr, int l, int r, bool t){
        if (l > tr || r < tl) return inff * !t;
        if (l <= tl && tr <= r) return (t) ? all[v].m2 : all[v].m1;
        int tm = (tl + tr) / 2, out = inff * !t;
        if (all[v].l){
            if (t){
                out = max(out, get(all[v].l, tl, tm, l, r, t));
            }
            else {
                out = min(out, get(all[v].l, tl, tm, l, r, t));
            }
        }
        if (all[v].r){
            if (t){
                out = max(out, get(all[v].r, tm + 1, tr, l, r, t));
            }
            else {
                out = min(out, get(all[v].r, tm + 1, tr, l, r, t));
            }
        }
        return out;
    }
    pii get(int x){
        return {get(1, 1, inf, x, inf, 0), get(1, 1, inf, 1, x, 1)};
    }
};
 
int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    int n, k, q; cin>>n>>k>>q;
    vector<int> x(n + 1), t(n + 1), a(n + 1), b(n + 1);
    for (int i = 1; i <= n; i++){
        cin>>x[i]>>t[i]>>a[i]>>b[i];
    }
    vector<int> xq(q + 1), yq(q + 1);
    for (int i = 1; i <= q; i++){
        cin>>xq[i]>>yq[i];
    }
 
    vector<arr3> mp;
    for (int i = 1; i <= n; i++){
        mp.pb({a[i], 1, i});
        if (b[i] < inf) mp.pb({b[i] + 1, 2, i});
    }
    for (int i = 1; i <= q; i++){
        mp.pb({yq[i], i + 2, xq[i]});
    }
    
    auto cmp = [&](arr3 x, arr3 y){
        if (x[0] == y[0]){
            return x[1] < y[1];
        }
        return x[0] < y[0];
    };
    
    sort(mp.begin(), mp.end(), cmp);
    
    vector<int> out(q + 1), cnt(k + 1);
    multiset<int> st[k + 1];
    int df = 0, l, r;
    IT T; T.init();
    for (auto [X, tt, i]: mp){
        if (tt == 1){
            df += !cnt[t[i]];
            cnt[t[i]]++;
            if (cnt[t[i]] == 1){
                if (1 < x[i]) T.add(1, x[i] - 1);
                if (x[i] < inf) T.add(x[i] + 1, inf);
                st[t[i]].insert(x[i]);
                continue;
            }
            
            if (st[t[i]].find(x[i]) != st[t[i]].end()){
                st[t[i]].insert(x[i]);
                continue;
            }
            
            auto it = st[t[i]].upper_bound(x[i]);
            if (it == st[t[i]].end()) r = inf;
            else r = (*it) - 1;
            if (it == st[t[i]].begin()) l = 1;
            else l = *prev(it) + 1;
            
            if (l <= r) T.rem(l, r);
            if (l < x[i]) T.add(l, x[i] - 1);
            if (x[i] < r) T.add(x[i] + 1, r);
            
            st[t[i]].insert(x[i]);
        }
        else if (tt == 2){
            cnt[t[i]]--;
            df -= !cnt[t[i]];
            
            if (st[t[i]].count(x[i]) > 1){
                st[t[i]].erase(st[t[i]].find(x[i]));
                continue;
            }
            
            auto it = st[t[i]].find(x[i]);
            
            if (it == st[t[i]].begin()) l = 1;
            else l = *prev(it) + 1;
            if (it == prev(st[t[i]].end())) r = inf;
            else r = *next(it) - 1;
            
            if (l < x[i]) T.rem(l, x[i] - 1);
            if (x[i] < r) T.rem(x[i] + 1, r);
            
            if (cnt[t[i]]) T.add(l, r);
            st[t[i]].erase(it);
        }
        else {
            int ii = tt - 2;
            if (df < k){
                out[ii] = -1;
                continue;
            }
            
            auto [l, r] = T.get(i);
            if (l != inff) out[ii] = max(out[ii], i - l);
            if (r != 0) out[ii] = max(out[ii], r - i);
        }
    }
    
    for (int i = 1; i <= q; i++){
        cout<<out[i]<<"\n";
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 28496 KB Output is correct
2 Correct 24 ms 28496 KB Output is correct
3 Correct 24 ms 28488 KB Output is correct
4 Correct 24 ms 28496 KB Output is correct
5 Correct 24 ms 28496 KB Output is correct
6 Correct 27 ms 29360 KB Output is correct
7 Correct 24 ms 28496 KB Output is correct
8 Correct 24 ms 29004 KB Output is correct
9 Correct 25 ms 28496 KB Output is correct
10 Correct 26 ms 29344 KB Output is correct
11 Correct 25 ms 28752 KB Output is correct
12 Correct 25 ms 29080 KB Output is correct
13 Correct 24 ms 28740 KB Output is correct
14 Correct 25 ms 28752 KB Output is correct
15 Correct 25 ms 28752 KB Output is correct
16 Correct 26 ms 28752 KB Output is correct
17 Correct 25 ms 28976 KB Output is correct
18 Correct 26 ms 28752 KB Output is correct
19 Correct 26 ms 28752 KB Output is correct
20 Correct 28 ms 28992 KB Output is correct
21 Correct 24 ms 28600 KB Output is correct
22 Correct 29 ms 28748 KB Output is correct
23 Correct 26 ms 28744 KB Output is correct
24 Correct 29 ms 28744 KB Output is correct
25 Correct 28 ms 28992 KB Output is correct
26 Correct 28 ms 28996 KB Output is correct
27 Correct 28 ms 28496 KB Output is correct
28 Correct 25 ms 28744 KB Output is correct
29 Correct 28 ms 28864 KB Output is correct
30 Correct 26 ms 28752 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 28496 KB Output is correct
2 Correct 24 ms 28496 KB Output is correct
3 Correct 24 ms 28488 KB Output is correct
4 Correct 24 ms 28496 KB Output is correct
5 Correct 24 ms 28496 KB Output is correct
6 Correct 27 ms 29360 KB Output is correct
7 Correct 24 ms 28496 KB Output is correct
8 Correct 24 ms 29004 KB Output is correct
9 Correct 25 ms 28496 KB Output is correct
10 Correct 26 ms 29344 KB Output is correct
11 Correct 25 ms 28752 KB Output is correct
12 Correct 25 ms 29080 KB Output is correct
13 Correct 24 ms 28740 KB Output is correct
14 Correct 25 ms 28752 KB Output is correct
15 Correct 25 ms 28752 KB Output is correct
16 Correct 26 ms 28752 KB Output is correct
17 Correct 25 ms 28976 KB Output is correct
18 Correct 26 ms 28752 KB Output is correct
19 Correct 26 ms 28752 KB Output is correct
20 Correct 28 ms 28992 KB Output is correct
21 Correct 24 ms 28600 KB Output is correct
22 Correct 29 ms 28748 KB Output is correct
23 Correct 26 ms 28744 KB Output is correct
24 Correct 29 ms 28744 KB Output is correct
25 Correct 28 ms 28992 KB Output is correct
26 Correct 28 ms 28996 KB Output is correct
27 Correct 28 ms 28496 KB Output is correct
28 Correct 25 ms 28744 KB Output is correct
29 Correct 28 ms 28864 KB Output is correct
30 Correct 26 ms 28752 KB Output is correct
31 Runtime error 602 ms 157256 KB Execution killed with signal 11
32 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 734 ms 221984 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 626 ms 201844 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 28496 KB Output is correct
2 Correct 24 ms 28496 KB Output is correct
3 Correct 24 ms 28488 KB Output is correct
4 Correct 24 ms 28496 KB Output is correct
5 Correct 24 ms 28496 KB Output is correct
6 Correct 27 ms 29360 KB Output is correct
7 Correct 24 ms 28496 KB Output is correct
8 Correct 24 ms 29004 KB Output is correct
9 Correct 25 ms 28496 KB Output is correct
10 Correct 26 ms 29344 KB Output is correct
11 Correct 25 ms 28752 KB Output is correct
12 Correct 25 ms 29080 KB Output is correct
13 Correct 24 ms 28740 KB Output is correct
14 Correct 25 ms 28752 KB Output is correct
15 Correct 25 ms 28752 KB Output is correct
16 Correct 26 ms 28752 KB Output is correct
17 Correct 25 ms 28976 KB Output is correct
18 Correct 26 ms 28752 KB Output is correct
19 Correct 26 ms 28752 KB Output is correct
20 Correct 28 ms 28992 KB Output is correct
21 Correct 24 ms 28600 KB Output is correct
22 Correct 29 ms 28748 KB Output is correct
23 Correct 26 ms 28744 KB Output is correct
24 Correct 29 ms 28744 KB Output is correct
25 Correct 28 ms 28992 KB Output is correct
26 Correct 28 ms 28996 KB Output is correct
27 Correct 28 ms 28496 KB Output is correct
28 Correct 25 ms 28744 KB Output is correct
29 Correct 28 ms 28864 KB Output is correct
30 Correct 26 ms 28752 KB Output is correct
31 Runtime error 602 ms 157256 KB Execution killed with signal 11
32 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 25 ms 28496 KB Output is correct
2 Correct 24 ms 28496 KB Output is correct
3 Correct 24 ms 28488 KB Output is correct
4 Correct 24 ms 28496 KB Output is correct
5 Correct 24 ms 28496 KB Output is correct
6 Correct 27 ms 29360 KB Output is correct
7 Correct 24 ms 28496 KB Output is correct
8 Correct 24 ms 29004 KB Output is correct
9 Correct 25 ms 28496 KB Output is correct
10 Correct 26 ms 29344 KB Output is correct
11 Correct 25 ms 28752 KB Output is correct
12 Correct 25 ms 29080 KB Output is correct
13 Correct 24 ms 28740 KB Output is correct
14 Correct 25 ms 28752 KB Output is correct
15 Correct 25 ms 28752 KB Output is correct
16 Correct 26 ms 28752 KB Output is correct
17 Correct 25 ms 28976 KB Output is correct
18 Correct 26 ms 28752 KB Output is correct
19 Correct 26 ms 28752 KB Output is correct
20 Correct 28 ms 28992 KB Output is correct
21 Correct 24 ms 28600 KB Output is correct
22 Correct 29 ms 28748 KB Output is correct
23 Correct 26 ms 28744 KB Output is correct
24 Correct 29 ms 28744 KB Output is correct
25 Correct 28 ms 28992 KB Output is correct
26 Correct 28 ms 28996 KB Output is correct
27 Correct 28 ms 28496 KB Output is correct
28 Correct 25 ms 28744 KB Output is correct
29 Correct 28 ms 28864 KB Output is correct
30 Correct 26 ms 28752 KB Output is correct
31 Runtime error 602 ms 157256 KB Execution killed with signal 11
32 Halted 0 ms 0 KB -