Submission #829449

#TimeUsernameProblemLanguageResultExecution timeMemory
829449rainboyInspections (NOI23_inspections)C11
100 / 100
357 ms36572 KiB
#include <stdio.h> #define N 200000 #define M 200000 #define Q 200000 #define M_ (M * 3 + 2) #define INF 0x3f3f3f3f3f3f3f3fLL int min(int a, int b) { return a < b ? a : b; } int max(int a, int b) { return a > b ? a : b; } unsigned int Z = 12345; int rand_() { return (Z *= 3) >> 1; } int zz[M_], ll[M_], rr[M_], ii[M_], jj[M_], u_, l_, r_; long long xx[M_]; int node(int l, int r, long long x) { static int _ = 1; zz[_] = rand_(); ii[_] = l, jj[_] = r, xx[_] = x; return _++; } void split_i(int u, int i) { if (u == 0) { u_ = l_ = r_ = 0; return; } if (ii[u] <= i) { split_i(rr[u], i); rr[u] = l_, l_ = u; } else { split_i(ll[u], i); ll[u] = r_, r_ = u; } } void split_j(int u, int i) { if (u == 0) { u_ = l_ = r_ = 0; return; } if (jj[u] <= i) { split_j(rr[u], i); rr[u] = l_, l_ = u; } else { split_j(ll[u], i); ll[u] = r_, r_ = u; } } int merge(int u, int v) { if (u == 0) return v; if (v == 0) return u; if (zz[u] < zz[v]) { rr[u] = merge(rr[u], v); return u; } else { ll[v] = merge(u, ll[v]); return v; } } int first(int u) { return ll[u] == 0 ? u : first(ll[u]); } int last(int u) { return rr[u] == 0 ? u : last(rr[u]); } long long tt[M_]; int ww[M_], m_; void add_segments(int u, int i, int j, long long x) { if (u == 0) return; add_segments(ll[u], i, j, x); tt[m_] = xx[u] == -INF ? 0 : x - xx[u], ww[m_] = max(min(j, jj[u]) - max(i, ii[u]) + 1, 0), m_++; add_segments(rr[u], i, j, x); } void sort(int *hh, int l, int r) { while (l < r) { int i = l, j = l, k = r, h = hh[l + rand_() % (r - l)], tmp; while (j < k) if (tt[hh[j]] == tt[h]) j++; else if (tt[hh[j]] < tt[h]) { tmp = hh[i], hh[i] = hh[j], hh[j] = tmp; i++, j++; } else { k--; tmp = hh[j], hh[j] = hh[k], hh[k] = tmp; } sort(hh, l, i); l = k; } } int main() { static int hh[M_]; static long long kk[M_ + 1]; int n, m, q, h, i, j; long long k; scanf("%d%d%d", &n, &m, &q); k = 0, u_ = node(0, n - 1, -INF); while (m--) { int l, m, m_, r, u; scanf("%d%d", &i, &j), i--, j--; split_j(u_, i - 1), l = l_; split_i(r_, j), m = l_, r = r_; add_segments(m, i, j, k - i); m_ = node(i, j, k - i); if (ii[u = first(m)] < i) m_ = merge(node(ii[u], i - 1, xx[u]), m_); if (jj[u = last(m)] > j) m_ = merge(m_, node(j + 1, jj[u], xx[u])); u_ = merge(merge(l, m_), r); k += j - i + 1; } for (h = 0; h < m_; h++) hh[h] = h; sort(hh, 0, m_); kk[0] = k; for (h = 0; h < m_; h++) kk[h + 1] = kk[h] - ww[hh[h]]; while (q--) { long long t; int lower, upper; scanf("%lld", &t); lower = -1, upper = m_; while (upper - lower > 1) { h = (lower + upper) / 2; if (tt[hh[h]] <= t) lower = h; else upper = h; } printf("%lld ", kk[upper]); } printf("\n"); return 0; }

Compilation message (stderr)

Main.c: In function 'main':
Main.c:113:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  113 |  scanf("%d%d%d", &n, &m, &q);
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~
Main.c:118:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  118 |   scanf("%d%d", &i, &j), i--, j--;
      |   ^~~~~~~~~~~~~~~~~~~~~
Main.c:140:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
  140 |   scanf("%lld", &t);
      |   ^~~~~~~~~~~~~~~~~
#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...