Submission #1127861

#TimeUsernameProblemLanguageResultExecution timeMemory
1127861VinhLuuFood Court (JOI21_foodcourt)C++20
24 / 100
351 ms49008 KiB

#include <bits/stdc++.h>
#define ll long long
#define all(lpv) lpv.begin(), lpv.end()
#define pot(x, y) lower_bound(x.begin(), x.end(), y) - x.begin() + 1
using namespace std;

#define lpv

#ifndef lpv
#include "AC.h"
#endif // lpv

//#define int long long

const int N = 3e5 + 5;

int n, m, q, type[N], L[N], C[N], K[N], sz[N], kq[N];
ll R[N];

vector<int> Q[N];

ll st[N << 2], T[N << 2], f[N << 2];

void change(int i,int l,int r,int u,int x) {
  if(l > r || r < u || u < l) return;
  if(l == r) {
    st[i] = x;
    T[i] = x;
    if(x >= 0) f[i] = x;
    return;
  }
  int mid = (l + r) / 2;
  change(i << 1, l, mid, u, x);
  change(i << 1|1, mid + 1, r, u, x);
  st[i] = st[i << 1] + st[i << 1|1];
  T[i] = min(T[i << 1], st[i << 1] + T[i << 1|1]);
  f[i] = f[i << 1] + f[i << 1|1];
//  cerr << i << " " << l << " " << r << " " << st[i] << " " << T[i] << " " << f[i] << "k\n";
}

ll sum = 0;

void query(int i,int l,int r,int u,int v) {
  if(l > r || r < u || v < l) return;
  if(u <= l && r <= v) {
    if(sum + T[i] <= 0) sum = st[i] - T[i];
    else sum += st[i];
    return;
  }
  int mid = (l + r) / 2;
  query(i << 1, l, mid, u, v);
  query(i << 1|1, mid + 1, r, u, v);
}

bool flag;
int re, pos;

void get(int i,int l,int r,int u,int v) {
  if(l > r || r < u || v < l) return;
  if(u <= l && r <= v) {
    if(f[i] < re) {
      re -= f[i];
      return;
    }
    flag = 0;
//    cerr << i << " " << l << " " << r << " " << f[i] << " " << f[i << 1] << " " << f[i << 1|1] << " k\n";
    if(l == r) {
      pos = l;
    } else {
      int mid = (l + r) / 2;
      if(f[i << 1|1] < re) {
        re -= f[i << 1|1];
        get(i << 1, l, mid, u, v);
      } else {

        get(i << 1|1, mid + 1, r, u, v);
      }
    }
    return;
  }
  int mid = (l + r) / 2;
  if(flag) get(i << 1|1, mid + 1, r, u, v);
  if(flag) get(i << 1, l, mid, u, v);

}

vector<pair<int,int>> op[N], cl[N];


#ifdef lpv
signed main() {
  ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  #define task "v"
  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 ++) {
    cin >> type[i];
    if(type[i] == 1) cin >> L[i] >> R[i] >> C[i] >> K[i];
    else if(type[i] == 2) cin >> L[i] >> R[i] >> K[i];
    else cin >> L[i] >> R[i];
  }

  for(int i = 1; i <= q; i ++) {
    if(type[i] == 3) Q[L[i]].push_back(i);
    else if (type[i] == 1) {
      op[L[i]].push_back({1, i});
      cl[R[i] + 1].push_back({1, i});
    } else if (type[i] == 2) {
      op[L[i]].push_back({0, i});
      cl[R[i] + 1].push_back({0, i});
    }
  }

  for(int i = 1; i <= n; i ++) {
//    cerr << i << " start\n";

    for(auto [t, id] : op[i]) {
      if(t) change(1, 1, q, id, K[id]);
      else change(1, 1, q, id, -K[id]);
    }
    for(auto [t, id] : cl[i]) {
      change(1, 1, q, id, 0);
    }
    for(auto id : Q[i]) {
      sum = 0;
      query(1, 1, q, 1, id);
//      cerr << id << " " << sum << " " << R[id] << " f\n";
      if(sum < R[id]) {
        kq[id] = 0;
        continue;
      } else {
        pos = 0;
        re = sum - R[id] + 1;
        flag = 1;
//        cerr << re << " " << q << " " << id << " t\n";
        get(1, 1, q, 1, id);
        kq[id] = C[pos];
      }
    }
  }
  for(int i = 1; i <= q; i ++) if(type[i] == 3) cout << kq[i] << "\n";

}
#endif // lpv

Compilation message (stderr)

foodcourt.cpp: In function 'int main()':
foodcourt.cpp:96:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   96 |     freopen(task ".inp","r",stdin);
      |     ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~
foodcourt.cpp:97:12: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   97 |     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...