답안 #1108019

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1108019 2024-11-02T15:13:44 Z mispertion 새 집 (APIO18_new_home) C++17
80 / 100
5000 ms 408660 KB
#include<bits/stdc++.h>
 
using namespace std;
 
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
using ll = long long;
using ld = long double;
using pii = pair<int, int>;
#define F first
#define S second
 
const ld PI = 3.1415926535;
const int N = 5e5 + 2;
const int M = 1e7 + 1;
int mod = 998244353;
const int infi = INT_MAX;
const ll infl = LLONG_MAX;
 
int mult(int a, int b) {
    return a * 1LL * b % mod;
}
 
int sum(int a, int b) {
    if (a + b < 0)
        return a + b + mod;
    if (a + b >= mod)
        return a + b - mod;
    return a + b;
}
 
 
ll binpow(ll a, ll n) {
    if (n == 0)
        return 1;
    if (n % 2 == 1) {
        return binpow(a, n - 1) * a % mod;
    } else {
        ll b = binpow(a, n / 2);
        return b * b % mod;
    }
}
 
struct segtree{
    int t[M], l[M], r[M];
    int cur = 0;
 
    segtree(){
        t[0] = -infi;
        l[0] = -1;
        r[0] = -1;
    }
 
    void add(int v, int tl, int tr, int i, int x){
        if(tl == tr){
            t[v] = max(t[v], x);
            //cout << v << ' ' << l[v] << ' ' << r[v] << ' ' << tl << ' ' << tr << ' ' << t[v] << '\n';
            return;
        }
        int tm = (tl + tr) / 2;
        if(i <= tm){
            if(l[v] == -1){
                l[v] = ++cur;
                t[cur] = -infi;
                l[cur] = -1;
                r[cur] = -1;
            }
            add(l[v], tl, tm, i, x);
        }else{
            if(r[v] == -1){
                r[v] = ++cur;
                t[cur] = -infi;
                l[cur] = -1;
                r[cur] = -1;
            }
            add(r[v], tm + 1, tr, i, x);
        }
        t[v] = -infi;
        if(l[v] != -1)
            t[v] = max(t[v], t[l[v]]);
        if(r[v] != -1)
            t[v] = max(t[v], t[r[v]]);
        //cout << v << ' ' << l[v] << ' ' << r[v] << ' ' << tl << ' ' << tr << ' ' << t[v] << '\n';
    }
 
    void sett(int v, int tl, int tr, int i, int x){
        if(tl == tr){
            t[v] = x;
            //cout << v << ' ' << l[v] << ' ' << r[v] << ' ' << tl << ' ' << tr << ' ' << t[v] << '\n';
            return;
        }
        int tm = (tl + tr) / 2;
        if(i <= tm){
            if(l[v] == -1){
                l[v] = ++cur;
                t[cur] = -infi;
                l[cur] = -1;
                r[cur] = -1;
            }
            sett(l[v], tl, tm, i, x);
        }else{
            if(r[v] == -1){
                r[v] = ++cur;
                t[cur] = -infi;
                l[cur] = -1;
                r[cur] = -1;
            }
            sett(r[v], tm + 1, tr, i, x);
        }
        t[v] = -infi;
        if(l[v] != -1)
            t[v] = max(t[v], t[l[v]]);
        if(r[v] != -1)
            t[v] = max(t[v], t[r[v]]);
        //cout << v << ' ' << l[v] << ' ' << r[v] << ' ' << tl << ' ' << tr << ' ' << t[v] << '\n';
    }
 
    int get(int v, int tl, int tr, int lu, int ru){
        if(v == -1)
            return -infi;
        if(tl > ru || lu > tr)
            return -infi;
        if(lu <= tl && tr <= ru)
            return t[v];
        int tm = (tl + tr) / 2;
        return max(get(l[v], tl, tm, lu, ru), get(r[v], tm + 1, tr, lu, ru));
    }
};
 
int n, q, k, ans[N], L = 0, R = 2e8;
vector<pair<pii, pii>> evs;
multiset<int> cr[N];
unordered_map<int, multiset<int>> spl, spr;
segtree lt = segtree(), rt = segtree();
 
void add(int i, int x1, int x2){
    lt.add(0, L, R, i, x1);
    rt.add(0, L, R, i, x2);
    spl[i].insert(x1);
    spr[i].insert(x2);
}
 
void rem(int i, int x1, int x2){
    auto da = spl.find(i);
    auto ha = spr.find(i);
    auto ed = (--da->S.end());
    auto hd = (--ha->S.end());
    if(*ed == x1){
        da->S.erase(ed);
        if(da->S.size() > 0){
            lt.sett(0, L, R, i, *(--da->S.end()));
        }else{
            lt.sett(0, L, R, i, -infi);
        }
    }else{
        da->S.erase(da->S.find(x1));
    }
    if(*hd == x2){
        ha->S.erase(hd);
        if(ha->S.size() > 0)
            rt.sett(0, L, R, i, *(--ha->S.end()));
        else
            rt.sett(0, L, R, i, -infi);
    }else{
        ha->S.erase(ha->S.find(x2));
    }
}
 
void solve() {
    cin >> n >> k >> q;
    for(int i = 1; i <= n; i++){
        int x, tp, a, b;
        cin >> x >> tp >> a >> b;
        x *= 2;
        evs.push_back({{a, 1}, {x, tp}});
        evs.push_back({{b + 1, -1}, {x, tp}});
    }
    for(int i = 1; i <= q; i++){
        int l, y;
        cin >> l >> y;
        l *= 2;
        evs.push_back({{y, 2}, {l, i}});
    }
    sort(evs.begin(), evs.end());
    int cnt = k;
    for(auto ev : evs){
        //cout << ev.F.F << ' ' << ev.F.S << ' ' << ev.S.F << ' ' << ev.S.S << '\n';
        if(ev.F.S == 1){
            int x = ev.S.F, tp = ev.S.S;
            if(cr[tp].find(x) != cr[tp].end()){
                cr[tp].insert(x);
                continue;
            }
            if(cr[tp].size() == 0){
                cr[tp].insert(x);
                add(L, x, x - 2 * L);
                add(R, 2 * R - x, -x);
                cnt--;
                continue;
            }
            int l = -1, r = -1;
            auto it = cr[tp].upper_bound(x);
            if(it != cr[tp].end()){
                add(((*it) + x) / 2, *it, -x);
                r = *it;
            }else{
                add(R, 2 * R - x, -x);
            }
            it = cr[tp].lower_bound(x);
            if(it != cr[tp].begin()){
                it--;
                add((x + (*it)) / 2, x, -(*it));
                l = *it;
            }else{
                add(L, x, x - 2 * L);
            }
            if(l != -1 && r != -1){
                rem((r + l) / 2, r, -l);
            }
            if(r == -1 && l != -1){
                rem(R, 2 * R - l, -l);
            }
            if(r != -1 && l == -1){
                rem(L, r, r - 2 * L);
            }
            cr[tp].insert(x);
        }else if(ev.F.S == -1){
            int x = ev.S.F, tp = ev.S.S;
            int l = -1, r = -1;
            if(cr[tp].count(x) > 1){
                cr[tp].erase(cr[tp].find(x));
                continue;
            }
            auto it = cr[tp].upper_bound(x);
            if(it != cr[tp].end()){
                r = *it;
                rem((r + x) / 2, r, -x);
            }else{
                rem(R, 2 * R - x, -x);
            }
            it = cr[tp].lower_bound(x);
            if(it != cr[tp].begin()){
                it--;
                l = (*it);
                rem((x + l) / 2, x, -l);
            }else{
                rem(L, x, x - 2 * L);
            }
            cr[tp].erase(cr[tp].find(x));
            if(l == -1 && r == -1){
                cnt++;
            }else if(l == -1){
                add(L, r, r - 2 * L);
            }else if(r == -1){
                add(R, 2 * R - l, -l);
            }else{
                add((r + l) / 2, r, -l);
            }
        }else{
            int x = ev.S.F, i = ev.S.S;
            int ret = max(lt.get(0, L, R, L, x) - x, rt.get(0, L, R, x, R) + x);
            if(cnt != 0)
                ans[i] = -1;
            else
                ans[i] = (ret < 0 ? -1 : ret / 2);
        }    
        //cout << cnt << '\n';   
    }
    for(int i = 1; i <=q; i++)
        cout << ans[i] << ' ';
    cout << '\n';
}
 
signed main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int t = 1;
    //cin >> t;
    while (t--) {
        solve();
    }
    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 35164 KB Output is correct
2 Correct 6 ms 35324 KB Output is correct
3 Correct 5 ms 35152 KB Output is correct
4 Correct 6 ms 35152 KB Output is correct
5 Correct 6 ms 35408 KB Output is correct
6 Correct 8 ms 37456 KB Output is correct
7 Correct 6 ms 35408 KB Output is correct
8 Correct 8 ms 37460 KB Output is correct
9 Correct 6 ms 35408 KB Output is correct
10 Correct 7 ms 37712 KB Output is correct
11 Correct 7 ms 37456 KB Output is correct
12 Correct 8 ms 37432 KB Output is correct
13 Correct 7 ms 37328 KB Output is correct
14 Correct 7 ms 37456 KB Output is correct
15 Correct 7 ms 37456 KB Output is correct
16 Correct 10 ms 37456 KB Output is correct
17 Correct 8 ms 37456 KB Output is correct
18 Correct 8 ms 37456 KB Output is correct
19 Correct 7 ms 37584 KB Output is correct
20 Correct 8 ms 37456 KB Output is correct
21 Correct 7 ms 35576 KB Output is correct
22 Correct 7 ms 35460 KB Output is correct
23 Correct 8 ms 37456 KB Output is correct
24 Correct 7 ms 37592 KB Output is correct
25 Correct 7 ms 37624 KB Output is correct
26 Correct 7 ms 37456 KB Output is correct
27 Correct 6 ms 35408 KB Output is correct
28 Correct 7 ms 37484 KB Output is correct
29 Correct 8 ms 37456 KB Output is correct
30 Correct 7 ms 37456 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 35164 KB Output is correct
2 Correct 6 ms 35324 KB Output is correct
3 Correct 5 ms 35152 KB Output is correct
4 Correct 6 ms 35152 KB Output is correct
5 Correct 6 ms 35408 KB Output is correct
6 Correct 8 ms 37456 KB Output is correct
7 Correct 6 ms 35408 KB Output is correct
8 Correct 8 ms 37460 KB Output is correct
9 Correct 6 ms 35408 KB Output is correct
10 Correct 7 ms 37712 KB Output is correct
11 Correct 7 ms 37456 KB Output is correct
12 Correct 8 ms 37432 KB Output is correct
13 Correct 7 ms 37328 KB Output is correct
14 Correct 7 ms 37456 KB Output is correct
15 Correct 7 ms 37456 KB Output is correct
16 Correct 10 ms 37456 KB Output is correct
17 Correct 8 ms 37456 KB Output is correct
18 Correct 8 ms 37456 KB Output is correct
19 Correct 7 ms 37584 KB Output is correct
20 Correct 8 ms 37456 KB Output is correct
21 Correct 7 ms 35576 KB Output is correct
22 Correct 7 ms 35460 KB Output is correct
23 Correct 8 ms 37456 KB Output is correct
24 Correct 7 ms 37592 KB Output is correct
25 Correct 7 ms 37624 KB Output is correct
26 Correct 7 ms 37456 KB Output is correct
27 Correct 6 ms 35408 KB Output is correct
28 Correct 7 ms 37484 KB Output is correct
29 Correct 8 ms 37456 KB Output is correct
30 Correct 7 ms 37456 KB Output is correct
31 Correct 919 ms 120216 KB Output is correct
32 Correct 107 ms 42432 KB Output is correct
33 Correct 928 ms 115612 KB Output is correct
34 Correct 812 ms 114000 KB Output is correct
35 Correct 892 ms 120760 KB Output is correct
36 Correct 808 ms 121272 KB Output is correct
37 Correct 461 ms 111728 KB Output is correct
38 Correct 574 ms 110624 KB Output is correct
39 Correct 434 ms 111600 KB Output is correct
40 Correct 447 ms 111208 KB Output is correct
41 Correct 342 ms 74632 KB Output is correct
42 Correct 341 ms 78644 KB Output is correct
43 Correct 73 ms 44984 KB Output is correct
44 Correct 364 ms 79348 KB Output is correct
45 Correct 343 ms 79032 KB Output is correct
46 Correct 340 ms 79032 KB Output is correct
47 Correct 212 ms 68536 KB Output is correct
48 Correct 215 ms 70072 KB Output is correct
49 Correct 263 ms 73552 KB Output is correct
50 Correct 259 ms 70328 KB Output is correct
51 Correct 240 ms 75928 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2389 ms 216648 KB Output is correct
2 Correct 1771 ms 236596 KB Output is correct
3 Correct 846 ms 136820 KB Output is correct
4 Correct 2405 ms 208660 KB Output is correct
5 Correct 1743 ms 228396 KB Output is correct
6 Correct 1525 ms 234604 KB Output is correct
7 Correct 791 ms 132988 KB Output is correct
8 Correct 2373 ms 206564 KB Output is correct
9 Correct 2608 ms 221180 KB Output is correct
10 Correct 1903 ms 234860 KB Output is correct
11 Correct 1468 ms 227204 KB Output is correct
12 Correct 1796 ms 235432 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4730 ms 308752 KB Output is correct
2 Correct 2240 ms 69380 KB Output is correct
3 Correct 4014 ms 323528 KB Output is correct
4 Correct 1094 ms 135252 KB Output is correct
5 Correct 3460 ms 238852 KB Output is correct
6 Correct 3151 ms 220100 KB Output is correct
7 Correct 3755 ms 323004 KB Output is correct
8 Correct 3450 ms 323544 KB Output is correct
9 Correct 1162 ms 136624 KB Output is correct
10 Correct 3729 ms 232660 KB Output is correct
11 Correct 4045 ms 296700 KB Output is correct
12 Correct 4491 ms 322196 KB Output is correct
13 Correct 2122 ms 300816 KB Output is correct
14 Correct 1826 ms 305972 KB Output is correct
15 Correct 2159 ms 310984 KB Output is correct
16 Correct 2613 ms 310920 KB Output is correct
17 Correct 2463 ms 311692 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 35164 KB Output is correct
2 Correct 6 ms 35324 KB Output is correct
3 Correct 5 ms 35152 KB Output is correct
4 Correct 6 ms 35152 KB Output is correct
5 Correct 6 ms 35408 KB Output is correct
6 Correct 8 ms 37456 KB Output is correct
7 Correct 6 ms 35408 KB Output is correct
8 Correct 8 ms 37460 KB Output is correct
9 Correct 6 ms 35408 KB Output is correct
10 Correct 7 ms 37712 KB Output is correct
11 Correct 7 ms 37456 KB Output is correct
12 Correct 8 ms 37432 KB Output is correct
13 Correct 7 ms 37328 KB Output is correct
14 Correct 7 ms 37456 KB Output is correct
15 Correct 7 ms 37456 KB Output is correct
16 Correct 10 ms 37456 KB Output is correct
17 Correct 8 ms 37456 KB Output is correct
18 Correct 8 ms 37456 KB Output is correct
19 Correct 7 ms 37584 KB Output is correct
20 Correct 8 ms 37456 KB Output is correct
21 Correct 7 ms 35576 KB Output is correct
22 Correct 7 ms 35460 KB Output is correct
23 Correct 8 ms 37456 KB Output is correct
24 Correct 7 ms 37592 KB Output is correct
25 Correct 7 ms 37624 KB Output is correct
26 Correct 7 ms 37456 KB Output is correct
27 Correct 6 ms 35408 KB Output is correct
28 Correct 7 ms 37484 KB Output is correct
29 Correct 8 ms 37456 KB Output is correct
30 Correct 7 ms 37456 KB Output is correct
31 Correct 919 ms 120216 KB Output is correct
32 Correct 107 ms 42432 KB Output is correct
33 Correct 928 ms 115612 KB Output is correct
34 Correct 812 ms 114000 KB Output is correct
35 Correct 892 ms 120760 KB Output is correct
36 Correct 808 ms 121272 KB Output is correct
37 Correct 461 ms 111728 KB Output is correct
38 Correct 574 ms 110624 KB Output is correct
39 Correct 434 ms 111600 KB Output is correct
40 Correct 447 ms 111208 KB Output is correct
41 Correct 342 ms 74632 KB Output is correct
42 Correct 341 ms 78644 KB Output is correct
43 Correct 73 ms 44984 KB Output is correct
44 Correct 364 ms 79348 KB Output is correct
45 Correct 343 ms 79032 KB Output is correct
46 Correct 340 ms 79032 KB Output is correct
47 Correct 212 ms 68536 KB Output is correct
48 Correct 215 ms 70072 KB Output is correct
49 Correct 263 ms 73552 KB Output is correct
50 Correct 259 ms 70328 KB Output is correct
51 Correct 240 ms 75928 KB Output is correct
52 Correct 170 ms 55700 KB Output is correct
53 Correct 156 ms 46776 KB Output is correct
54 Correct 476 ms 75932 KB Output is correct
55 Correct 292 ms 73912 KB Output is correct
56 Correct 254 ms 68956 KB Output is correct
57 Correct 337 ms 72936 KB Output is correct
58 Correct 297 ms 69824 KB Output is correct
59 Correct 279 ms 68024 KB Output is correct
60 Correct 333 ms 72588 KB Output is correct
61 Correct 153 ms 53940 KB Output is correct
62 Correct 167 ms 56364 KB Output is correct
63 Correct 368 ms 65976 KB Output is correct
64 Correct 379 ms 72468 KB Output is correct
65 Correct 396 ms 71008 KB Output is correct
66 Correct 360 ms 74680 KB Output is correct
67 Correct 208 ms 43276 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 35164 KB Output is correct
2 Correct 6 ms 35324 KB Output is correct
3 Correct 5 ms 35152 KB Output is correct
4 Correct 6 ms 35152 KB Output is correct
5 Correct 6 ms 35408 KB Output is correct
6 Correct 8 ms 37456 KB Output is correct
7 Correct 6 ms 35408 KB Output is correct
8 Correct 8 ms 37460 KB Output is correct
9 Correct 6 ms 35408 KB Output is correct
10 Correct 7 ms 37712 KB Output is correct
11 Correct 7 ms 37456 KB Output is correct
12 Correct 8 ms 37432 KB Output is correct
13 Correct 7 ms 37328 KB Output is correct
14 Correct 7 ms 37456 KB Output is correct
15 Correct 7 ms 37456 KB Output is correct
16 Correct 10 ms 37456 KB Output is correct
17 Correct 8 ms 37456 KB Output is correct
18 Correct 8 ms 37456 KB Output is correct
19 Correct 7 ms 37584 KB Output is correct
20 Correct 8 ms 37456 KB Output is correct
21 Correct 7 ms 35576 KB Output is correct
22 Correct 7 ms 35460 KB Output is correct
23 Correct 8 ms 37456 KB Output is correct
24 Correct 7 ms 37592 KB Output is correct
25 Correct 7 ms 37624 KB Output is correct
26 Correct 7 ms 37456 KB Output is correct
27 Correct 6 ms 35408 KB Output is correct
28 Correct 7 ms 37484 KB Output is correct
29 Correct 8 ms 37456 KB Output is correct
30 Correct 7 ms 37456 KB Output is correct
31 Correct 919 ms 120216 KB Output is correct
32 Correct 107 ms 42432 KB Output is correct
33 Correct 928 ms 115612 KB Output is correct
34 Correct 812 ms 114000 KB Output is correct
35 Correct 892 ms 120760 KB Output is correct
36 Correct 808 ms 121272 KB Output is correct
37 Correct 461 ms 111728 KB Output is correct
38 Correct 574 ms 110624 KB Output is correct
39 Correct 434 ms 111600 KB Output is correct
40 Correct 447 ms 111208 KB Output is correct
41 Correct 342 ms 74632 KB Output is correct
42 Correct 341 ms 78644 KB Output is correct
43 Correct 73 ms 44984 KB Output is correct
44 Correct 364 ms 79348 KB Output is correct
45 Correct 343 ms 79032 KB Output is correct
46 Correct 340 ms 79032 KB Output is correct
47 Correct 212 ms 68536 KB Output is correct
48 Correct 215 ms 70072 KB Output is correct
49 Correct 263 ms 73552 KB Output is correct
50 Correct 259 ms 70328 KB Output is correct
51 Correct 240 ms 75928 KB Output is correct
52 Correct 2389 ms 216648 KB Output is correct
53 Correct 1771 ms 236596 KB Output is correct
54 Correct 846 ms 136820 KB Output is correct
55 Correct 2405 ms 208660 KB Output is correct
56 Correct 1743 ms 228396 KB Output is correct
57 Correct 1525 ms 234604 KB Output is correct
58 Correct 791 ms 132988 KB Output is correct
59 Correct 2373 ms 206564 KB Output is correct
60 Correct 2608 ms 221180 KB Output is correct
61 Correct 1903 ms 234860 KB Output is correct
62 Correct 1468 ms 227204 KB Output is correct
63 Correct 1796 ms 235432 KB Output is correct
64 Correct 4730 ms 308752 KB Output is correct
65 Correct 2240 ms 69380 KB Output is correct
66 Correct 4014 ms 323528 KB Output is correct
67 Correct 1094 ms 135252 KB Output is correct
68 Correct 3460 ms 238852 KB Output is correct
69 Correct 3151 ms 220100 KB Output is correct
70 Correct 3755 ms 323004 KB Output is correct
71 Correct 3450 ms 323544 KB Output is correct
72 Correct 1162 ms 136624 KB Output is correct
73 Correct 3729 ms 232660 KB Output is correct
74 Correct 4045 ms 296700 KB Output is correct
75 Correct 4491 ms 322196 KB Output is correct
76 Correct 2122 ms 300816 KB Output is correct
77 Correct 1826 ms 305972 KB Output is correct
78 Correct 2159 ms 310984 KB Output is correct
79 Correct 2613 ms 310920 KB Output is correct
80 Correct 2463 ms 311692 KB Output is correct
81 Correct 170 ms 55700 KB Output is correct
82 Correct 156 ms 46776 KB Output is correct
83 Correct 476 ms 75932 KB Output is correct
84 Correct 292 ms 73912 KB Output is correct
85 Correct 254 ms 68956 KB Output is correct
86 Correct 337 ms 72936 KB Output is correct
87 Correct 297 ms 69824 KB Output is correct
88 Correct 279 ms 68024 KB Output is correct
89 Correct 333 ms 72588 KB Output is correct
90 Correct 153 ms 53940 KB Output is correct
91 Correct 167 ms 56364 KB Output is correct
92 Correct 368 ms 65976 KB Output is correct
93 Correct 379 ms 72468 KB Output is correct
94 Correct 396 ms 71008 KB Output is correct
95 Correct 360 ms 74680 KB Output is correct
96 Correct 208 ms 43276 KB Output is correct
97 Correct 1226 ms 137180 KB Output is correct
98 Correct 1519 ms 61604 KB Output is correct
99 Execution timed out 5071 ms 408660 KB Time limit exceeded
100 Halted 0 ms 0 KB -