제출 #1274755

#제출 시각아이디문제언어결과실행 시간메모리
1274755zNatsumi푸드 코트 (JOI21_foodcourt)C++20
100 / 100
361 ms44004 KiB
#include <bits/stdc++.h>

using namespace std;

using i64 = int64_t;

const int N = 3e5 + 5;

int n, m, q, c[N], res[N];
vector<int> cl[N];
vector<pair<int, int>> op[N];
vector<pair<int, i64>> que[N];

i64 f[N << 2], g[N << 2], t[N << 2]; // sum, sum of non-negative, minimum prefix

void update(int x, int y, int tl = 1, int tr = q, int i = 1){
  if(tl == tr){
    f[i] = t[i] = y;
    if(y >= 0) g[i] = y;
    return;
  }
  int tm = tl + tr >> 1;
  if(x <= tm) update(x, y, tl, tm, i<<1);
  else update(x, y, tm + 1, tr, i<<1|1);

  f[i] = f[i<<1] + f[i<<1|1];
  g[i] = g[i<<1] + g[i<<1|1];
  t[i] = min(t[i<<1], f[i<<1] + t[i<<1|1]);
}

i64 sum = 0;
void CountCustomer(int l, int r, int tl = 1, int tr = q, int i = 1){
  if(r < tl || tr < l || l > r) return;
  if(l <= tl && tr <= r){
    if(sum + t[i] <= 0) sum = f[i] - t[i];
    else sum += f[i];
    return;
  }
  int tm = tl + tr >> 1;
  CountCustomer(l, r, tl, tm, i<<1);
  CountCustomer(l, r, tm + 1, tr, i<<1|1);
}

int pos;
void Query(int l, int r, int tl = 1, int tr = q, int i = 1){
  if(r < tl || tr < l || l > r) return;
  if(l <= tl && tr <= r){
    if(tl == tr && g[i] >= sum){
      pos = tl;
      return;
    }
    int tm = tl + tr >> 1;
    if(sum > g[i]) sum -= g[i];
    else if(sum > g[i<<1|1]){
      sum -= g[i<<1|1];
      Query(l, r, tl, tm, i<<1);
    }else Query(l, r, tm + 1, tr, i<<1|1);

    return;
  }
  int tm = tl + tr >> 1;
  if(pos == -1) Query(l, r, tm + 1, tr, i<<1|1);
  if(pos == -1) Query(l, r, tl, tm, i<<1);
}

int32_t main(){
  cin.tie(0)->sync_with_stdio(0);
//  #define task "test"
//  if(fopen(task ".inp", "r")){
//    freopen(task ".inp", "r", stdin);
//    freopen(task ".out", "w", stdout);
//  }
  cin >> n >> m >> q;
  for(int i = 1; i <= q; i++){
    int type; cin >> type;
    if(type == 1){
      int l, r, k; cin >> l >> r >> c[i] >> k;
      op[l].push_back({i, k});
      cl[r + 1].push_back(i);
    }
    if(type == 2){
      int l, r, k; cin >> l >> r >> k;
      op[l].push_back({i, -k});
      cl[r + 1].push_back(i);
    }
    if(type == 3){
      int a; cin >> a;
      i64 b; cin >> b;
      que[a].push_back({i, b});
    }
    res[i] = -1;
  }

  for(int i = 1; i <= n; i++){
    for(auto [idx, val] : op[i]) update(idx, val);
    for(auto idx : cl[i]) update(idx, 0);

    for(auto [idx, b] : que[i]){
      sum = 0;
      CountCustomer(1, idx);

      if(sum < b){
        res[idx] = 0;
        continue;
      }
      sum = sum - b + 1;
      pos = -1; Query(1, idx);
      res[idx] = c[pos];
    }
  }
  for(int i = 1; i <= q; i++) if(res[i] != -1) cout << res[i] << "\n";

  return 0;
}
#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...