Submission #485228

#TimeUsernameProblemLanguageResultExecution timeMemory
485228rainboyMostovi (COI14_mostovi)C11
100 / 100
217 ms2776 KiB
#include <stdio.h> #define N 200000 #define INF 0x7fffffff unsigned int X = 12345; int rand_() { return (X *= 3) >> 1; } int zz[4 + N], ll[4 + N], rr[4 + N], aa[4 + N], bb[4 + N], u_, l_, r_; int node(int a, int b) { static int _ = 1; zz[_] = rand_(); aa[_] = a, bb[_] = b; return _++; } void split(int u, int a) { if (u == 0) { u_ = l_ = r_ = 0; return; } if (aa[u] < a) { split(rr[u], a); rr[u] = l_, l_ = u; } else { split(ll[u], a); 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; } } void floor_(int u, int a, int b, int *x, int *y) { *x = *y = -1; while (u) if (aa[u] <= a && bb[u] <= b) *x = aa[u], *y = bb[u], u = rr[u]; else u = ll[u]; } void ceil_(int u, int a, int b, int *x, int *y) { *x = *y = INF; while (u) if (aa[u] >= a && bb[u] >= b) *x = aa[u], *y = bb[u], u = ll[u]; else u = rr[u]; } int main() { int n, q, u1, u2; scanf("%d%d", &n, &q); u1 = 0, u2 = merge(node(-1, 0), merge(node(n - 1, n), node(n * 2 - 1, n * 2))); while (q--) { static char s[2]; int a, b, tmp; scanf("%s%d%d", s, &a, &b), a--, b--; if (s[0] != 'Q') { if (a > b) tmp = a, a = b, b = tmp; if (s[0] == 'A') split(u1, a), u1 = merge(merge(l_, node(a, b)), r_); else split(u2, a), u2 = merge(merge(l_, node(a, b)), r_); } else { int la, ra, lb, rb, a1, a2, b1, b2, c, tmp, da; floor_(u2, INF, a, &tmp, &la), ceil_(u2, a, -1, &ra, &tmp); floor_(u2, INF, b, &tmp, &lb), ceil_(u2, b, -1, &rb, &tmp); da = 0; if (a < n && b < n) { if (a < b) da = la == lb && ra == rb; else { ceil_(u1, a, -1, &a1, &a2), floor_(u1, b, INF, &b1, &b2); if (a1 <= ra && b1 >= lb) { ceil_(u2, b2, -1, &c, &tmp); da = c >= a2; } } } else if (a >= n && b >= n) { if (a > b) da = la == lb && ra == rb; else { floor_(u1, INF, a, &a1, &a2), ceil_(u1, -1, b, &b1, &b2); if (a2 >= la && b2 <= rb) { ceil_(u2, a1, -1, &c, &tmp); da = c >= b1; } } } else if (a < n && b >= n) { ceil_(u1, a, b, &a1, &a2); da = a1 <= ra && a2 <= rb; } else { floor_(u1, b, a, &b1, &b2); da = b2 >= la && b1 >= lb; } printf(da ? "DA\n" : "NE\n"); } } return 0; }

Compilation message (stderr)

mostovi.c: In function 'main':
mostovi.c:71:2: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   71 |  scanf("%d%d", &n, &q);
      |  ^~~~~~~~~~~~~~~~~~~~~
mostovi.c:77:3: warning: ignoring return value of 'scanf' declared with attribute 'warn_unused_result' [-Wunused-result]
   77 |   scanf("%s%d%d", s, &a, &b), a--, b--;
      |   ^~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...