Submission #381246

#TimeUsernameProblemLanguageResultExecution timeMemory
381246rainboyNew Home (APIO18_new_home)C11
57 / 100
5071 ms200576 KiB
#pragma GCC optimize("O3") #include <stdio.h> #include <stdlib.h> #define N 300000 #define Q 300000 #define L_ 19 /* L_ = ceil(log2(Q)) */ #define N_ (1 << L_) #define INF 0x3f3f3f3f int min(int a, int b) { return a < b ? a : b; } int max(int a, int b) { return a > b ? a : b; } unsigned int X = 12345; int rand_() { return (X *= 3) >> 1; } int xx[N], gg[N], n; int yy[Q], yy_[Q], tt_[Q], tt1[Q], q_; int compareh_y(int h1, int h2) { return yy[h1] - yy[h2]; } int compareh_t(int h1, int h2) { return tt_[h1] - tt_[h2]; } int compare_i(int i, int j) { return gg[i] != gg[j] ? gg[i] - gg[j] : xx[i] - xx[j]; } int (*compare)(int, int); void sort(int *ii, int l, int r) { while (l < r) { int i = l, j = l, k = r, i_ = ii[l + rand_() % (r - l)], tmp; while (j < k) { int c = compare(ii[j], i_); if (c == 0) j++; else if (c < 0) { tmp = ii[i], ii[i] = ii[j], ii[j] = tmp; i++, j++; } else { k--; tmp = ii[j], ii[j] = ii[k], ii[k] = tmp; } } sort(ii, l, i); l = k; } } int idx(int *xx, int x) { int lower = -1, upper = q_; while (upper - lower > 1) { int h = (lower + upper) / 2; if (xx[h] <= x) lower = h; else upper = h; } return lower; } int stmn[N_ * 2], stmx[N_ * 2], *ei[N_ * 2], eo[N_ * 2], n_; char upd[L_ + 2][N_ * 2]; int qu[L_ + 2][N_ * 2], cnt[L_ + 2]; int oldmn[L_ + 2][N_ * 2], oldmx[L_ + 2][N_ * 2]; void push(int i, int x, int t) { if (!upd[t][i]) { upd[t][i] = 1, qu[t][cnt[t]++] = i; oldmn[t][i] = stmn[i], oldmx[t][i] = stmx[i]; } stmn[i] = min(stmn[i], x); stmx[i] = max(stmx[i], x); } void pop(int t) { while (cnt[t]--) { int i = qu[t][cnt[t]]; upd[t][i] = 0; stmn[i] = oldmn[t][i], stmx[i] = oldmx[t][i]; } cnt[t] = 0; } void build() { int i; n_ = 1; while (n_ < q_) n_ <<= 1; for (i = 1; i < n_ * 2; i++) stmn[i] = INF, stmx[i] = -INF; for (i = 1; i < n_ * 2; i++) ei[i] = (int *) malloc(2 * sizeof *ei[i]); } void update(int l, int r, int x, int t) { for (l += n_, r += n_; l <= r; l >>= 1, r >>= 1) { if ((l & 1) == 1) push(l++, x, t); if ((r & 1) == 0) push(r--, x, t); } } int query(int i) { int y, l, r; l = r = y = yy_[i]; for (i += n_; i > 0; i >>= 1) l = min(l, stmn[i]), r = max(r, stmx[i]); return l == -INF || r == INF ? -1 : max(y - l, r - y); } int mid(int a, int b) { return a + b > 0 ? (a + b) / 2 : -(-a + b + 1) / 2; } int pp[N], qq[N]; void remove_(int i, int t) { int p = pp[i], q = qq[i]; if (p != -1) qq[p] = q; if (q != -1) pp[q] = p; if (p == -1 && q == -1) update(0, q_ - 1, INF, t), update(0, q_ - 1, -INF, t); else if (p == -1) update(0, idx(yy_, xx[q]), xx[q], t); else if (q == -1) update(idx(yy_, xx[p] - 1) + 1, q_ - 1, xx[p], t); else { int l = idx(yy_, xx[p] - 1) + 1, h = idx(yy_, mid(xx[p], xx[q])), r = idx(yy_, xx[q]); update(l, h, xx[p], t), update(h + 1, r, xx[q], t); } } void add(int i) { int p = pp[i], q = qq[i]; if (p != -1) qq[p] = i; if (q != -1) pp[q] = i; } void append_(int i, int i_) { int o = eo[i]++; if (o >= 2 && (o & o - 1) == 0) ei[i] = (int *) realloc(ei[i], o * 2 * sizeof *ei[i]); ei[i][o] = i_; } void update_(int l, int r, int i_) { for (l += n_, r += n_; l <= r; l >>= 1, r >>= 1) { if ((l & 1) == 1) append_(l++, i_); if ((r & 1) == 0) append_(r--, i_); } } int hh[Q], inv[Q], ans[Q]; void solve(int i, int t) { int o; for (o = eo[i]; o--; ) { int i_ = ei[i][o]; remove_(i_, t); } if (i >= n_) { int h = i - n_; if (h < q_) ans[hh[h]] = query(inv[hh[h]]); } else solve(i << 1 | 0, t + 1), solve(i << 1 | 1, t + 1); for (o = 0; o < eo[i]; o++) { int i_ = ei[i][o]; add(i_); } pop(t); } int main() { static int tt[N * 2], ii[N], ll[N], rr[N]; static char used[N]; int k, g, h, i; scanf("%d%d%d", &n, &k, &q_); for (i = 0; i < n; i++) { scanf("%d%d%d%d", &xx[i], &gg[i], &tt[i << 1 | 0], &tt[i << 1 | 1]), gg[i]--; used[gg[i]] = 1; } for (g = 0; g < k; g++) if (!used[g]) { for (h = 0; h < q_; h++) printf("-1\n"); return 0; } for (h = 0; h < q_; h++) scanf("%d%d", &yy[h], &tt_[h]); for (h = 0; h < q_; h++) hh[h] = h; compare = compareh_y, sort(hh, 0, q_); for (h = 0; h < q_; h++) yy_[h] = yy[hh[h]], inv[hh[h]] = h; for (i = 0; i < n; i++) ii[i] = i; compare = compare_i, sort(ii, 0, n); pp[ii[0]] = -1, qq[ii[n - 1]] = -1; ll[0] = 0, rr[n - 1] = q_ - 1; for (h = 0; h + 1 < n; h++) if (gg[ii[h]] == gg[ii[h + 1]]) { int h_ = idx(yy_, mid(xx[ii[h]], xx[ii[h + 1]])); qq[ii[h]] = ii[h + 1], pp[ii[h + 1]] = ii[h]; rr[h] = h_, ll[h + 1] = h_ + 1; } else { qq[ii[h]] = -1, pp[ii[h + 1]] = -1; rr[h] = q_ - 1, ll[h + 1] = 0; } build(); for (h = 0; h < n; h++) if (ll[h] <= rr[h]) update(ll[h], rr[h], xx[ii[h]], 0); compare = compareh_t, sort(hh, 0, q_); for (h = 0; h < q_; h++) tt1[h] = tt_[hh[h]]; for (i = 0; i < n; i++) update_(0, idx(tt1, tt[i << 1 | 0] - 1), i), update_(idx(tt1, tt[i << 1 | 1]) + 1, q_ - 1, i); solve(1, 1); for (h = 0; h < q_; h++) printf("%d\n", ans[h]); return 0; }

Compilation message (stderr)

new_home.c: In function 'append_':
new_home.c:164:23: warning: suggest parentheses around '-' in operand of '&' [-Wparentheses]
  164 |  if (o >= 2 && (o & o - 1) == 0)
      |                     ~~^~~
new_home.c: In function 'main':
new_home.c:208:2: warning: ignoring return value of 'scanf', declared with attribute warn_unused_result [-Wunused-result]
  208 |  scanf("%d%d%d", &n, &k, &q_);
      |  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
new_home.c:210:3: warning: ignoring return value of 'scanf', declared with attribute warn_unused_result [-Wunused-result]
  210 |   scanf("%d%d%d%d", &xx[i], &gg[i], &tt[i << 1 | 0], &tt[i << 1 | 1]), gg[i]--;
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
new_home.c:220:3: warning: ignoring return value of 'scanf', declared with attribute warn_unused_result [-Wunused-result]
  220 |   scanf("%d%d", &yy[h], &tt_[h]);
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...