Bons deuses uma pergunta!
Uma vez que existe apenas uma porta para cada tecla correspondente, a ordem relativa para destrancar a porta entre nós e a porta pode ser determinada.
Por exemplo, abrir a porta $ (x, x + 1) $ é, se o $ [1, X] $ entre $ x + 1 $ que não podem, em qualquer caso, para o lado de $ X $, $ X $ é possível, mas pode para chegar a US $ x + 1 $ aqui.
Então nós fomos para desbloquear $ x + 1 $, em seguida, ir para desbloquear $ x $, então $ x $ pode herdar diretamente expandir o resultado de US $ x + 1 $ a.
código:
<. bocados / STDC ++ H> #include #define ll longo longo #define N 1.000.200 #define setIO (s) fReopen (s ".in", "R", entrada padrão) usando o espaço de nomes std; bordas int = 1; int hd [N], para [N << 1], Nex [N << 1], ° [N]; Void Adicionar (int u, int v) { nex [++ bordas] = hd [u], hd [u] = bordas, para bordas [] = v; deg [v] ++; } Int n, m, Q, P [N], tot, tecla [N]; fila <int> q; vazio TOPO () { int i, j; for (i = n; i; - i) if (! deg [i]) q.push (i); while (q.empty ()!) { int u = q.front (); q.pop (); p [++ tot] = L; para (int i = hd [u]; i; i = NEX [i]) { int v = a [i]; --deg [v]; if (deg [v]!) q.push (v); } } } Int L [N], R [N]; vazio cal (int x) { int = l x, r = x; enquanto (1) { int pl = l, pr = r; enquanto (L> 1 && (tecla [L-1] || (l <= tecla [L-1] && tecla [L-1] <= r))!) L = L [L-1]; enquanto (r <N && (tecla [r] || (l <= tecla [r] && tecla [r] <= r))!) r = R [I + 1]; se (l == pl && r == PR) break; } L [X] = l, R [X] = r; } Int main () { // setIO ( "input"); int i, j; scanf ( "% d% d% d", e n, m &, & Q); if (L [S] <= T && t < = R [s]) printf ( "SIM \ n"); outro for (i = 1; i <= m; i ++) { int x, y; scanf ( "% d% d", & X, & Y); tecla [X] = y; se (y <= x) suplemento (x + 1, x); outra 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]); enquanto (Q--) { int S, T; scanf ( "% d% d", e s, & t); printf ( "NÃO \ n"); } Return 0; }