답안 #1108031

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1108031 2024-11-02T15:46:13 Z mispertion 새 집 (APIO18_new_home) C++17
57 / 100
5000 ms 298644 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 = 9e6 + 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 7 ms 37200 KB Output is correct
2 Correct 6 ms 37372 KB Output is correct
3 Correct 7 ms 37212 KB Output is correct
4 Correct 6 ms 37200 KB Output is correct
5 Correct 7 ms 37456 KB Output is correct
6 Correct 9 ms 37456 KB Output is correct
7 Correct 7 ms 37352 KB Output is correct
8 Correct 8 ms 37712 KB Output is correct
9 Correct 7 ms 37456 KB Output is correct
10 Correct 7 ms 37712 KB Output is correct
11 Correct 6 ms 37456 KB Output is correct
12 Correct 7 ms 37456 KB Output is correct
13 Correct 6 ms 37456 KB Output is correct
14 Correct 7 ms 37624 KB Output is correct
15 Correct 6 ms 37456 KB Output is correct
16 Correct 6 ms 37556 KB Output is correct
17 Correct 6 ms 37456 KB Output is correct
18 Correct 6 ms 37368 KB Output is correct
19 Correct 7 ms 37624 KB Output is correct
20 Correct 7 ms 37456 KB Output is correct
21 Correct 7 ms 37456 KB Output is correct
22 Correct 7 ms 37456 KB Output is correct
23 Correct 6 ms 37456 KB Output is correct
24 Correct 7 ms 37516 KB Output is correct
25 Correct 7 ms 37356 KB Output is correct
26 Correct 8 ms 37456 KB Output is correct
27 Correct 6 ms 37456 KB Output is correct
28 Correct 7 ms 37348 KB Output is correct
29 Correct 7 ms 37456 KB Output is correct
30 Correct 6 ms 37456 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 37200 KB Output is correct
2 Correct 6 ms 37372 KB Output is correct
3 Correct 7 ms 37212 KB Output is correct
4 Correct 6 ms 37200 KB Output is correct
5 Correct 7 ms 37456 KB Output is correct
6 Correct 9 ms 37456 KB Output is correct
7 Correct 7 ms 37352 KB Output is correct
8 Correct 8 ms 37712 KB Output is correct
9 Correct 7 ms 37456 KB Output is correct
10 Correct 7 ms 37712 KB Output is correct
11 Correct 6 ms 37456 KB Output is correct
12 Correct 7 ms 37456 KB Output is correct
13 Correct 6 ms 37456 KB Output is correct
14 Correct 7 ms 37624 KB Output is correct
15 Correct 6 ms 37456 KB Output is correct
16 Correct 6 ms 37556 KB Output is correct
17 Correct 6 ms 37456 KB Output is correct
18 Correct 6 ms 37368 KB Output is correct
19 Correct 7 ms 37624 KB Output is correct
20 Correct 7 ms 37456 KB Output is correct
21 Correct 7 ms 37456 KB Output is correct
22 Correct 7 ms 37456 KB Output is correct
23 Correct 6 ms 37456 KB Output is correct
24 Correct 7 ms 37516 KB Output is correct
25 Correct 7 ms 37356 KB Output is correct
26 Correct 8 ms 37456 KB Output is correct
27 Correct 6 ms 37456 KB Output is correct
28 Correct 7 ms 37348 KB Output is correct
29 Correct 7 ms 37456 KB Output is correct
30 Correct 6 ms 37456 KB Output is correct
31 Correct 994 ms 121436 KB Output is correct
32 Correct 100 ms 43464 KB Output is correct
33 Correct 804 ms 118968 KB Output is correct
34 Correct 843 ms 115132 KB Output is correct
35 Correct 1081 ms 124240 KB Output is correct
36 Correct 1084 ms 124916 KB Output is correct
37 Correct 604 ms 114104 KB Output is correct
38 Correct 566 ms 116408 KB Output is correct
39 Correct 445 ms 112824 KB Output is correct
40 Correct 466 ms 115628 KB Output is correct
41 Correct 351 ms 78776 KB Output is correct
42 Correct 359 ms 78248 KB Output is correct
43 Correct 75 ms 44740 KB Output is correct
44 Correct 349 ms 78508 KB Output is correct
45 Correct 357 ms 78520 KB Output is correct
46 Correct 335 ms 78528 KB Output is correct
47 Correct 212 ms 71132 KB Output is correct
48 Correct 217 ms 74152 KB Output is correct
49 Correct 239 ms 77500 KB Output is correct
50 Correct 263 ms 74680 KB Output is correct
51 Correct 244 ms 77728 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2481 ms 207008 KB Output is correct
2 Correct 1781 ms 223808 KB Output is correct
3 Correct 877 ms 124864 KB Output is correct
4 Correct 2654 ms 194236 KB Output is correct
5 Correct 1810 ms 225540 KB Output is correct
6 Correct 1598 ms 223848 KB Output is correct
7 Correct 802 ms 124776 KB Output is correct
8 Correct 2831 ms 188452 KB Output is correct
9 Correct 3124 ms 215112 KB Output is correct
10 Correct 2251 ms 222520 KB Output is correct
11 Correct 1695 ms 220072 KB Output is correct
12 Correct 1940 ms 221808 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 5062 ms 298644 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 37200 KB Output is correct
2 Correct 6 ms 37372 KB Output is correct
3 Correct 7 ms 37212 KB Output is correct
4 Correct 6 ms 37200 KB Output is correct
5 Correct 7 ms 37456 KB Output is correct
6 Correct 9 ms 37456 KB Output is correct
7 Correct 7 ms 37352 KB Output is correct
8 Correct 8 ms 37712 KB Output is correct
9 Correct 7 ms 37456 KB Output is correct
10 Correct 7 ms 37712 KB Output is correct
11 Correct 6 ms 37456 KB Output is correct
12 Correct 7 ms 37456 KB Output is correct
13 Correct 6 ms 37456 KB Output is correct
14 Correct 7 ms 37624 KB Output is correct
15 Correct 6 ms 37456 KB Output is correct
16 Correct 6 ms 37556 KB Output is correct
17 Correct 6 ms 37456 KB Output is correct
18 Correct 6 ms 37368 KB Output is correct
19 Correct 7 ms 37624 KB Output is correct
20 Correct 7 ms 37456 KB Output is correct
21 Correct 7 ms 37456 KB Output is correct
22 Correct 7 ms 37456 KB Output is correct
23 Correct 6 ms 37456 KB Output is correct
24 Correct 7 ms 37516 KB Output is correct
25 Correct 7 ms 37356 KB Output is correct
26 Correct 8 ms 37456 KB Output is correct
27 Correct 6 ms 37456 KB Output is correct
28 Correct 7 ms 37348 KB Output is correct
29 Correct 7 ms 37456 KB Output is correct
30 Correct 6 ms 37456 KB Output is correct
31 Correct 994 ms 121436 KB Output is correct
32 Correct 100 ms 43464 KB Output is correct
33 Correct 804 ms 118968 KB Output is correct
34 Correct 843 ms 115132 KB Output is correct
35 Correct 1081 ms 124240 KB Output is correct
36 Correct 1084 ms 124916 KB Output is correct
37 Correct 604 ms 114104 KB Output is correct
38 Correct 566 ms 116408 KB Output is correct
39 Correct 445 ms 112824 KB Output is correct
40 Correct 466 ms 115628 KB Output is correct
41 Correct 351 ms 78776 KB Output is correct
42 Correct 359 ms 78248 KB Output is correct
43 Correct 75 ms 44740 KB Output is correct
44 Correct 349 ms 78508 KB Output is correct
45 Correct 357 ms 78520 KB Output is correct
46 Correct 335 ms 78528 KB Output is correct
47 Correct 212 ms 71132 KB Output is correct
48 Correct 217 ms 74152 KB Output is correct
49 Correct 239 ms 77500 KB Output is correct
50 Correct 263 ms 74680 KB Output is correct
51 Correct 244 ms 77728 KB Output is correct
52 Correct 190 ms 55748 KB Output is correct
53 Correct 197 ms 46756 KB Output is correct
54 Correct 521 ms 79800 KB Output is correct
55 Correct 328 ms 75560 KB Output is correct
56 Correct 313 ms 68532 KB Output is correct
57 Correct 386 ms 76716 KB Output is correct
58 Correct 366 ms 71864 KB Output is correct
59 Correct 328 ms 66996 KB Output is correct
60 Correct 436 ms 75752 KB Output is correct
61 Correct 168 ms 55976 KB Output is correct
62 Correct 180 ms 58008 KB Output is correct
63 Correct 393 ms 70072 KB Output is correct
64 Correct 441 ms 72376 KB Output is correct
65 Correct 465 ms 77048 KB Output is correct
66 Correct 348 ms 78572 KB Output is correct
67 Correct 204 ms 43948 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 37200 KB Output is correct
2 Correct 6 ms 37372 KB Output is correct
3 Correct 7 ms 37212 KB Output is correct
4 Correct 6 ms 37200 KB Output is correct
5 Correct 7 ms 37456 KB Output is correct
6 Correct 9 ms 37456 KB Output is correct
7 Correct 7 ms 37352 KB Output is correct
8 Correct 8 ms 37712 KB Output is correct
9 Correct 7 ms 37456 KB Output is correct
10 Correct 7 ms 37712 KB Output is correct
11 Correct 6 ms 37456 KB Output is correct
12 Correct 7 ms 37456 KB Output is correct
13 Correct 6 ms 37456 KB Output is correct
14 Correct 7 ms 37624 KB Output is correct
15 Correct 6 ms 37456 KB Output is correct
16 Correct 6 ms 37556 KB Output is correct
17 Correct 6 ms 37456 KB Output is correct
18 Correct 6 ms 37368 KB Output is correct
19 Correct 7 ms 37624 KB Output is correct
20 Correct 7 ms 37456 KB Output is correct
21 Correct 7 ms 37456 KB Output is correct
22 Correct 7 ms 37456 KB Output is correct
23 Correct 6 ms 37456 KB Output is correct
24 Correct 7 ms 37516 KB Output is correct
25 Correct 7 ms 37356 KB Output is correct
26 Correct 8 ms 37456 KB Output is correct
27 Correct 6 ms 37456 KB Output is correct
28 Correct 7 ms 37348 KB Output is correct
29 Correct 7 ms 37456 KB Output is correct
30 Correct 6 ms 37456 KB Output is correct
31 Correct 994 ms 121436 KB Output is correct
32 Correct 100 ms 43464 KB Output is correct
33 Correct 804 ms 118968 KB Output is correct
34 Correct 843 ms 115132 KB Output is correct
35 Correct 1081 ms 124240 KB Output is correct
36 Correct 1084 ms 124916 KB Output is correct
37 Correct 604 ms 114104 KB Output is correct
38 Correct 566 ms 116408 KB Output is correct
39 Correct 445 ms 112824 KB Output is correct
40 Correct 466 ms 115628 KB Output is correct
41 Correct 351 ms 78776 KB Output is correct
42 Correct 359 ms 78248 KB Output is correct
43 Correct 75 ms 44740 KB Output is correct
44 Correct 349 ms 78508 KB Output is correct
45 Correct 357 ms 78520 KB Output is correct
46 Correct 335 ms 78528 KB Output is correct
47 Correct 212 ms 71132 KB Output is correct
48 Correct 217 ms 74152 KB Output is correct
49 Correct 239 ms 77500 KB Output is correct
50 Correct 263 ms 74680 KB Output is correct
51 Correct 244 ms 77728 KB Output is correct
52 Correct 2481 ms 207008 KB Output is correct
53 Correct 1781 ms 223808 KB Output is correct
54 Correct 877 ms 124864 KB Output is correct
55 Correct 2654 ms 194236 KB Output is correct
56 Correct 1810 ms 225540 KB Output is correct
57 Correct 1598 ms 223848 KB Output is correct
58 Correct 802 ms 124776 KB Output is correct
59 Correct 2831 ms 188452 KB Output is correct
60 Correct 3124 ms 215112 KB Output is correct
61 Correct 2251 ms 222520 KB Output is correct
62 Correct 1695 ms 220072 KB Output is correct
63 Correct 1940 ms 221808 KB Output is correct
64 Execution timed out 5062 ms 298644 KB Time limit exceeded
65 Halted 0 ms 0 KB -