Buenos dioses una pregunta!
Dado que sólo hay una puerta para cada tecla correspondiente, el orden relativo para desbloquear la puerta entre nosotros y la puerta se puede determinar.
Por ejemplo, abrir la puerta $ (x, x + 1) $ es, si el $ [1, x] $ entre $ x + 1 $ no puede en todo caso en el lado de $ X $, $ X $ es posible, pero puede para llegar a $ x + 1 $ aquí.
Así que fuimos a desbloquear $ x + 1 $, y luego ir a desbloquear $ x $, por lo que $ x $ pueden heredar directamente ampliar el resultado de $ x + 1 $ a.
código:
<. bits / STDC ++ h> #include #define ll largo largo #define N 1000200 #define setIO (s) freopen (s ".En", "r", stdin) usando namespace std; bordes int = 1; int hd [N], a [N << 1], nex [N << 1], deg [N]; add void (int u, int v) { nex [++ bordes] = hd [u], hd [u] = bordes, a [bordes] = v; deg [v] ++; } Int n, m, Q, p [N], tot, tecla [N]; cola <int> q; void topo () { int i, j; for (i = n; i; - i) if (! deg [i]) q.push (i); mientras que (q.empty ()!) { int u = q.front (); q.pop (); p [++ tot] = u; for (int i = hd [u]; i; { --deg [v]; si: (Grados [v]!) q.push (v); } } } L [N] int, R [N]; void cal (int x) { int l = x, r = x; while (1) { int pl = l, pr = r; mientras que (l> 1 && (tecla [l-1] || (l <= tecla [l-1] && tecla [l-1] <= r))!) l = L [l-1]; mientras que (r <n && (tecla [r] || (l <= [R] && tecla [r] <= r))!) r = R [R + 1]; si (l == pl && r == pr) break; } L [x] = l, R [x] = r; } Int main () { // setIO ( "input"); int i, j; scanf ( "% d% d% d", y n, y m, y Q); for (i = 1; i <= m; ++ i) { int x, y; scanf ( "% d% d", y x, y y); tecla [x] = y; si (y <= x) add (x + 1, x); otro add (x, x + 1); } Topo (); for (i = 1; i <= n; ++ i) L [i] = R [i] = i; for (i = 1; i <= n; ++ i) cal (p [i]); while (Q--) { int s, t; scanf ( "% d% d", & s, y t); si (L [s] <= t && t < = R [s]) printf ( "SÍ \ n"); más printf ( "NO \ n"); } Return 0; }