답안 #1108035

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1108035 2024-11-02T15:49:43 Z mispertion 새 집 (APIO18_new_home) C++14
80 / 100
5000 ms 371616 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 = 8e6 + 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 35152 KB Output is correct
2 Correct 5 ms 35152 KB Output is correct
3 Correct 6 ms 35408 KB Output is correct
4 Correct 6 ms 35292 KB Output is correct
5 Correct 6 ms 35408 KB Output is correct
6 Correct 8 ms 35408 KB Output is correct
7 Correct 6 ms 35412 KB Output is correct
8 Correct 7 ms 35408 KB Output is correct
9 Correct 6 ms 35452 KB Output is correct
10 Correct 8 ms 35524 KB Output is correct
11 Correct 6 ms 35408 KB Output is correct
12 Correct 9 ms 35408 KB Output is correct
13 Correct 7 ms 35408 KB Output is correct
14 Correct 7 ms 35408 KB Output is correct
15 Correct 7 ms 35408 KB Output is correct
16 Correct 6 ms 35408 KB Output is correct
17 Correct 7 ms 35408 KB Output is correct
18 Correct 6 ms 35408 KB Output is correct
19 Correct 7 ms 35408 KB Output is correct
20 Correct 7 ms 35408 KB Output is correct
21 Correct 7 ms 35408 KB Output is correct
22 Correct 6 ms 35408 KB Output is correct
23 Correct 6 ms 35420 KB Output is correct
24 Correct 7 ms 35408 KB Output is correct
25 Correct 7 ms 35408 KB Output is correct
26 Correct 7 ms 35408 KB Output is correct
27 Correct 6 ms 35408 KB Output is correct
28 Correct 9 ms 35408 KB Output is correct
29 Correct 6 ms 35248 KB Output is correct
30 Correct 6 ms 35408 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 35152 KB Output is correct
2 Correct 5 ms 35152 KB Output is correct
3 Correct 6 ms 35408 KB Output is correct
4 Correct 6 ms 35292 KB Output is correct
5 Correct 6 ms 35408 KB Output is correct
6 Correct 8 ms 35408 KB Output is correct
7 Correct 6 ms 35412 KB Output is correct
8 Correct 7 ms 35408 KB Output is correct
9 Correct 6 ms 35452 KB Output is correct
10 Correct 8 ms 35524 KB Output is correct
11 Correct 6 ms 35408 KB Output is correct
12 Correct 9 ms 35408 KB Output is correct
13 Correct 7 ms 35408 KB Output is correct
14 Correct 7 ms 35408 KB Output is correct
15 Correct 7 ms 35408 KB Output is correct
16 Correct 6 ms 35408 KB Output is correct
17 Correct 7 ms 35408 KB Output is correct
18 Correct 6 ms 35408 KB Output is correct
19 Correct 7 ms 35408 KB Output is correct
20 Correct 7 ms 35408 KB Output is correct
21 Correct 7 ms 35408 KB Output is correct
22 Correct 6 ms 35408 KB Output is correct
23 Correct 6 ms 35420 KB Output is correct
24 Correct 7 ms 35408 KB Output is correct
25 Correct 7 ms 35408 KB Output is correct
26 Correct 7 ms 35408 KB Output is correct
27 Correct 6 ms 35408 KB Output is correct
28 Correct 9 ms 35408 KB Output is correct
29 Correct 6 ms 35248 KB Output is correct
30 Correct 6 ms 35408 KB Output is correct
31 Correct 856 ms 119288 KB Output is correct
32 Correct 101 ms 41804 KB Output is correct
33 Correct 881 ms 117132 KB Output is correct
34 Correct 726 ms 113080 KB Output is correct
35 Correct 834 ms 122272 KB Output is correct
36 Correct 854 ms 122928 KB Output is correct
37 Correct 541 ms 114144 KB Output is correct
38 Correct 563 ms 114360 KB Output is correct
39 Correct 391 ms 110852 KB Output is correct
40 Correct 399 ms 113592 KB Output is correct
41 Correct 328 ms 78520 KB Output is correct
42 Correct 366 ms 78372 KB Output is correct
43 Correct 71 ms 42912 KB Output is correct
44 Correct 370 ms 78520 KB Output is correct
45 Correct 333 ms 78452 KB Output is correct
46 Correct 337 ms 78516 KB Output is correct
47 Correct 223 ms 68956 KB Output is correct
48 Correct 235 ms 72352 KB Output is correct
49 Correct 266 ms 73400 KB Output is correct
50 Correct 302 ms 72608 KB Output is correct
51 Correct 298 ms 75928 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2713 ms 205984 KB Output is correct
2 Correct 1764 ms 224936 KB Output is correct
3 Correct 877 ms 123660 KB Output is correct
4 Correct 2360 ms 195240 KB Output is correct
5 Correct 1870 ms 224508 KB Output is correct
6 Correct 1833 ms 224820 KB Output is correct
7 Correct 867 ms 123816 KB Output is correct
8 Correct 2561 ms 195224 KB Output is correct
9 Correct 2961 ms 213940 KB Output is correct
10 Correct 1976 ms 223528 KB Output is correct
11 Correct 1498 ms 219152 KB Output is correct
12 Correct 1898 ms 220808 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4731 ms 300112 KB Output is correct
2 Correct 2232 ms 65332 KB Output is correct
3 Correct 3967 ms 311716 KB Output is correct
4 Correct 1152 ms 122140 KB Output is correct
5 Correct 4124 ms 229880 KB Output is correct
6 Correct 3086 ms 207016 KB Output is correct
7 Correct 3848 ms 311032 KB Output is correct
8 Correct 4038 ms 311404 KB Output is correct
9 Correct 1093 ms 123056 KB Output is correct
10 Correct 3299 ms 221604 KB Output is correct
11 Correct 4888 ms 283868 KB Output is correct
12 Correct 4680 ms 311900 KB Output is correct
13 Correct 2032 ms 288932 KB Output is correct
14 Correct 2169 ms 294152 KB Output is correct
15 Correct 2414 ms 301256 KB Output is correct
16 Correct 2991 ms 295860 KB Output is correct
17 Correct 2462 ms 309808 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 35152 KB Output is correct
2 Correct 5 ms 35152 KB Output is correct
3 Correct 6 ms 35408 KB Output is correct
4 Correct 6 ms 35292 KB Output is correct
5 Correct 6 ms 35408 KB Output is correct
6 Correct 8 ms 35408 KB Output is correct
7 Correct 6 ms 35412 KB Output is correct
8 Correct 7 ms 35408 KB Output is correct
9 Correct 6 ms 35452 KB Output is correct
10 Correct 8 ms 35524 KB Output is correct
11 Correct 6 ms 35408 KB Output is correct
12 Correct 9 ms 35408 KB Output is correct
13 Correct 7 ms 35408 KB Output is correct
14 Correct 7 ms 35408 KB Output is correct
15 Correct 7 ms 35408 KB Output is correct
16 Correct 6 ms 35408 KB Output is correct
17 Correct 7 ms 35408 KB Output is correct
18 Correct 6 ms 35408 KB Output is correct
19 Correct 7 ms 35408 KB Output is correct
20 Correct 7 ms 35408 KB Output is correct
21 Correct 7 ms 35408 KB Output is correct
22 Correct 6 ms 35408 KB Output is correct
23 Correct 6 ms 35420 KB Output is correct
24 Correct 7 ms 35408 KB Output is correct
25 Correct 7 ms 35408 KB Output is correct
26 Correct 7 ms 35408 KB Output is correct
27 Correct 6 ms 35408 KB Output is correct
28 Correct 9 ms 35408 KB Output is correct
29 Correct 6 ms 35248 KB Output is correct
30 Correct 6 ms 35408 KB Output is correct
31 Correct 856 ms 119288 KB Output is correct
32 Correct 101 ms 41804 KB Output is correct
33 Correct 881 ms 117132 KB Output is correct
34 Correct 726 ms 113080 KB Output is correct
35 Correct 834 ms 122272 KB Output is correct
36 Correct 854 ms 122928 KB Output is correct
37 Correct 541 ms 114144 KB Output is correct
38 Correct 563 ms 114360 KB Output is correct
39 Correct 391 ms 110852 KB Output is correct
40 Correct 399 ms 113592 KB Output is correct
41 Correct 328 ms 78520 KB Output is correct
42 Correct 366 ms 78372 KB Output is correct
43 Correct 71 ms 42912 KB Output is correct
44 Correct 370 ms 78520 KB Output is correct
45 Correct 333 ms 78452 KB Output is correct
46 Correct 337 ms 78516 KB Output is correct
47 Correct 223 ms 68956 KB Output is correct
48 Correct 235 ms 72352 KB Output is correct
49 Correct 266 ms 73400 KB Output is correct
50 Correct 302 ms 72608 KB Output is correct
51 Correct 298 ms 75928 KB Output is correct
52 Correct 177 ms 54944 KB Output is correct
53 Correct 173 ms 44704 KB Output is correct
54 Correct 479 ms 77972 KB Output is correct
55 Correct 330 ms 70972 KB Output is correct
56 Correct 294 ms 66488 KB Output is correct
57 Correct 413 ms 74576 KB Output is correct
58 Correct 391 ms 69788 KB Output is correct
59 Correct 321 ms 65248 KB Output is correct
60 Correct 397 ms 75444 KB Output is correct
61 Correct 170 ms 53940 KB Output is correct
62 Correct 189 ms 55224 KB Output is correct
63 Correct 399 ms 67768 KB Output is correct
64 Correct 496 ms 72452 KB Output is correct
65 Correct 501 ms 75192 KB Output is correct
66 Correct 407 ms 78780 KB Output is correct
67 Correct 217 ms 42012 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 6 ms 35152 KB Output is correct
2 Correct 5 ms 35152 KB Output is correct
3 Correct 6 ms 35408 KB Output is correct
4 Correct 6 ms 35292 KB Output is correct
5 Correct 6 ms 35408 KB Output is correct
6 Correct 8 ms 35408 KB Output is correct
7 Correct 6 ms 35412 KB Output is correct
8 Correct 7 ms 35408 KB Output is correct
9 Correct 6 ms 35452 KB Output is correct
10 Correct 8 ms 35524 KB Output is correct
11 Correct 6 ms 35408 KB Output is correct
12 Correct 9 ms 35408 KB Output is correct
13 Correct 7 ms 35408 KB Output is correct
14 Correct 7 ms 35408 KB Output is correct
15 Correct 7 ms 35408 KB Output is correct
16 Correct 6 ms 35408 KB Output is correct
17 Correct 7 ms 35408 KB Output is correct
18 Correct 6 ms 35408 KB Output is correct
19 Correct 7 ms 35408 KB Output is correct
20 Correct 7 ms 35408 KB Output is correct
21 Correct 7 ms 35408 KB Output is correct
22 Correct 6 ms 35408 KB Output is correct
23 Correct 6 ms 35420 KB Output is correct
24 Correct 7 ms 35408 KB Output is correct
25 Correct 7 ms 35408 KB Output is correct
26 Correct 7 ms 35408 KB Output is correct
27 Correct 6 ms 35408 KB Output is correct
28 Correct 9 ms 35408 KB Output is correct
29 Correct 6 ms 35248 KB Output is correct
30 Correct 6 ms 35408 KB Output is correct
31 Correct 856 ms 119288 KB Output is correct
32 Correct 101 ms 41804 KB Output is correct
33 Correct 881 ms 117132 KB Output is correct
34 Correct 726 ms 113080 KB Output is correct
35 Correct 834 ms 122272 KB Output is correct
36 Correct 854 ms 122928 KB Output is correct
37 Correct 541 ms 114144 KB Output is correct
38 Correct 563 ms 114360 KB Output is correct
39 Correct 391 ms 110852 KB Output is correct
40 Correct 399 ms 113592 KB Output is correct
41 Correct 328 ms 78520 KB Output is correct
42 Correct 366 ms 78372 KB Output is correct
43 Correct 71 ms 42912 KB Output is correct
44 Correct 370 ms 78520 KB Output is correct
45 Correct 333 ms 78452 KB Output is correct
46 Correct 337 ms 78516 KB Output is correct
47 Correct 223 ms 68956 KB Output is correct
48 Correct 235 ms 72352 KB Output is correct
49 Correct 266 ms 73400 KB Output is correct
50 Correct 302 ms 72608 KB Output is correct
51 Correct 298 ms 75928 KB Output is correct
52 Correct 2713 ms 205984 KB Output is correct
53 Correct 1764 ms 224936 KB Output is correct
54 Correct 877 ms 123660 KB Output is correct
55 Correct 2360 ms 195240 KB Output is correct
56 Correct 1870 ms 224508 KB Output is correct
57 Correct 1833 ms 224820 KB Output is correct
58 Correct 867 ms 123816 KB Output is correct
59 Correct 2561 ms 195224 KB Output is correct
60 Correct 2961 ms 213940 KB Output is correct
61 Correct 1976 ms 223528 KB Output is correct
62 Correct 1498 ms 219152 KB Output is correct
63 Correct 1898 ms 220808 KB Output is correct
64 Correct 4731 ms 300112 KB Output is correct
65 Correct 2232 ms 65332 KB Output is correct
66 Correct 3967 ms 311716 KB Output is correct
67 Correct 1152 ms 122140 KB Output is correct
68 Correct 4124 ms 229880 KB Output is correct
69 Correct 3086 ms 207016 KB Output is correct
70 Correct 3848 ms 311032 KB Output is correct
71 Correct 4038 ms 311404 KB Output is correct
72 Correct 1093 ms 123056 KB Output is correct
73 Correct 3299 ms 221604 KB Output is correct
74 Correct 4888 ms 283868 KB Output is correct
75 Correct 4680 ms 311900 KB Output is correct
76 Correct 2032 ms 288932 KB Output is correct
77 Correct 2169 ms 294152 KB Output is correct
78 Correct 2414 ms 301256 KB Output is correct
79 Correct 2991 ms 295860 KB Output is correct
80 Correct 2462 ms 309808 KB Output is correct
81 Correct 177 ms 54944 KB Output is correct
82 Correct 173 ms 44704 KB Output is correct
83 Correct 479 ms 77972 KB Output is correct
84 Correct 330 ms 70972 KB Output is correct
85 Correct 294 ms 66488 KB Output is correct
86 Correct 413 ms 74576 KB Output is correct
87 Correct 391 ms 69788 KB Output is correct
88 Correct 321 ms 65248 KB Output is correct
89 Correct 397 ms 75444 KB Output is correct
90 Correct 170 ms 53940 KB Output is correct
91 Correct 189 ms 55224 KB Output is correct
92 Correct 399 ms 67768 KB Output is correct
93 Correct 496 ms 72452 KB Output is correct
94 Correct 501 ms 75192 KB Output is correct
95 Correct 407 ms 78780 KB Output is correct
96 Correct 217 ms 42012 KB Output is correct
97 Correct 1348 ms 122008 KB Output is correct
98 Correct 1557 ms 58792 KB Output is correct
99 Execution timed out 5089 ms 371616 KB Time limit exceeded
100 Halted 0 ms 0 KB -