제출 #1331018

#제출 시각아이디문제언어결과실행 시간메모리
1331018nanaseyuzuki푸드 코트 (JOI21_foodcourt)C++20
0 / 100
65 ms27092 KiB
#include <bits/stdc++.h>
#define ll long long
#define fi first
#define se second
#define pii pair<int, int>
#define all(a) a.begin(), a.end()
using namespace std;

#ifdef LOCAL
#include "C:\Users\Dell\Downloads\template\template\icpc-notebook\Utilities\debug.h"
#else
#define debug(...) 42
#endif

const int mn = 5e5 + 5, mod = 1e9 + 7, inf = 2e9;

int n, m, q, del[mn], l_[mn], r_[mn], ans[mn];
vector <int> event[mn];
struct Query {
	int t, l, r, c, k, a, b;
} e[mn];

int bit[mn];

void add(int u, int val){
    while(u <= n){
        bit[u] += val;
        u += (u & -u);
    }
}

int get(int u){
    int r = 0;
    while(u){
        r += bit[u];
        u -= (u & -u);
    }
    return r;
}

int st_add[mn << 2], st_del[mn << 2], lz[mn << 2];

void appAdd(int id, int val){
    st_add[id] += val;
}

void appDel(int id, int val){
    st_add[id] = st_add[id] - min(val, st_add[id]);
    st_del[id] += val - min(val, st_add[id]);
}

void down(int id, int l, int r){
    if(l == r) return;
    
    if(st_del[id]){
        appDel(id << 1, st_del[id]);
        appDel(id << 1 | 1, st_del[id]);
        st_del[id] = 0;
    }
    if(st_add[id]){
        appAdd(id << 1, st_add[id]);
        appAdd(id << 1 | 1, st_add[id]);
        st_add[id] = 0;
    } 
}

void update(int id, int l, int r, int u, int v, int val, int t){
    if(l > v || r < u) return;
    if(l >= u && r <= v){
        if(t == 1) appAdd(id, val);
        else if(t == -1) appDel(id, val);
        return;
    }
    down(id, l, r);
    int mid = (l + r) >> 1;
    update(id << 1, l, mid, u, v, val, t);
    update(id << 1 | 1, mid + 1, r, u, v, val, t);
}

int get(int id, int l, int r, int u){
    if(l > u || r < u) return 0;
    if(l == r) return st_add[id];
    down(id, l, r);
    int mid = (l + r) >> 1;
    return get(id << 1, l, mid, u) + get(id << 1 | 1, mid + 1, r, u);
}

void solve() {
    cin >> n >> m >> q;
    vector <int> candidate;
    for(int i = 1; i <= q; i++){
    	cin >> e[i].t;
    	if(e[i].t == 1){
            cin >> e[i].l >> e[i].r >> e[i].c >> e[i].k;
            add(e[i].l, e[i].k);
            add(e[i].r + 1, - e[i].k);
            update(1, 1, n, e[i].l, e[i].r, e[i].k, 1);
        }
    	else if(e[i].t == 2){
            cin >> e[i].l >> e[i].r >> e[i].k;
            update(1, 1, n, e[i].l, e[i].r, e[i].k, -1);
        }
        else{
            candidate.push_back(i);
            l_[i] = 1, r_[i] = i - 1;

            cin >> e[i].a >> e[i].b;
            del[i] = get(e[i].a) - get(1, 1, n, e[i].a);
            e[i].b += del[i];

            debug(i, e[i].a, e[i].b, del[i]);
        }
    }

    while(true){
        bool stop = true;
        for(auto id : candidate){
            if(l_[id] <= r_[id]){

                int mid = (l_[id] + r_[id]) >> 1;
                event[mid].push_back(id);
                stop = false;
            }
        }
        if(stop) break;

        fill(bit, bit + n + 1, 0);
        int fin = 0;
        for(int i = 1; i <= q; i++){
            fin = (e[i].t == 1 ? e[i].c : fin);
            if(e[i].t == 1){
                add(e[i].l, e[i].k);
                add(e[i].r + 1, - e[i].k);
            }
            for(auto id : event[i]){
                debug(id, e[id].a, e[id].b, i, get(e[id].a));
                if(get(e[id].a) >= e[id].b){
                    ans[id] = fin, r_[id] = i - 1;
                }
                else l_[id] = i + 1;
            }
            event[i].clear();
        }
    }

    for(auto i : candidate) cout << ans[i] << '\n';
}

signed main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    #define task "Kawabata"
    if (fopen(task".INP", "r")) {
        freopen(task".INP", "r", stdin);
        freopen(task".OUT", "w", stdout);
    }
    int t = 1;
    // cin >> t;
    while (t--) solve();
    return 0;
}
// Don't wanna lose anymore T_T
// Never let me go - Kazuo Ishiguro

컴파일 시 표준 에러 (stderr) 메시지

foodcourt.cpp: In function 'int main()':
foodcourt.cpp:154:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  154 |         freopen(task".INP", "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~
foodcourt.cpp:155:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
  155 |         freopen(task".OUT", "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...