program connessioni;
const MAXN =200000;
Qsize=400000;
var
N, Q, ricorda, conta,contazone,a ,b, h,i, j, w, z,x, y, risul: longint;
graph : array[0..MAXN-1] of array of longint;
gsize, gcapa: array[0..MAXN-1] of longint;
visited : array[0..MAXN-1] of boolean;
S,E,dist : array[0..MAXN-1] of longint;
q1, q2 : array[0..QSIZE-1] of longint;
uscita: boolean;
procedure bfs(b : longint; var res : array of longint);
var qhead, qcount, first, second, j : longint;
begin
q1[0] := b; q2[0] := 0;
qhead := 0; qcount := 1;
while qcount > 0 do
begin
first := q1[qhead];
second := q2[qhead];
inc(qhead);
if qhead = QSIZE then
qhead := 0;
dec(qcount);
if visited[first] then
continue;
visited[first] := True; ricorda:=first;
conta:=conta+1; (*memorizza il numero di nodi visitati*)
res[first] := second;
for j:=0 to gsize[first]-1 do
begin
q1[(qhead + qcount) mod QSIZE] := graph[first][j];
q2[(qhead + qcount) mod QSIZE] := second + 1;
inc(qcount);
end;
end;
end;
procedure inizia (N: longint);
begin
for h:=0 to N-1 do
begin
setlength(graph[h], 1);
(* all’inizio, la lista di adiacenza del nodo i ha dimensione 0
* e capacita’ 1. *)
gsize[h] := 0;
gcapa[h] := 1;
dist[h] := maxlongint;
end;
end;
function collega (x,y:longint):longint;
begin
S[i]:=x; E[i]:=y;
j:=1;
while j<=Q do
begin
for h:=0 to N-1 do visited[h]:=false;
inizia(N);
for h:=0 to j-1 do
begin
a := S[h]; b :=E[h];
(* se ho esaurito i posti nella lista di adiacenza del nodo a *)
if gsize[a] = gcapa[a] then
begin
(* allora raddoppio la sua capacita’ *)
gcapa[a] := gcapa[a] shl 1;
setlength(graph[a], gcapa[a]);
end;
graph[a][gsize[a]] := b;
inc(gsize[a]);
(* se ho esaurito i posti nella lista di adiacenza del nodo b *)
if gsize[b] = gcapa[b] then
begin
(* allora raddoppio la sua capacita’ *)
gcapa[b] := gcapa[b] shl 1;
setlength(graph[b], gcapa[b]);
end;
graph[b][gsize[b]] :=a;
inc(gsize[b]);
end;
contazone:=1; conta:=0;
bfs(0,dist);
while conta<N do
begin
w:=0; uscita:=false;
contazone:=contazone+1;
while (uscita=false) and (w<N) do if visited[w]=true then w:=w+1
else begin uscita:=true;ricorda:=w; end;
bfs(ricorda,dist);
end;
collega:=contazone; j:=j+1; end;
end;
begin
(*assign(input, 'input.txt'); reset(input);
assign(output, 'output.txt'); rewrite(output);*)
readln(N, Q);
inizia(N);
for i:=0 to Q-1 do
begin
readln (x,y);
writeln (collega(x,y));
end;
end.
cHJvZ3JhbSBjb25uZXNzaW9uaTsgCmNvbnN0IE1BWE4gPTIwMDAwMDsKICAgICAgUXNpemU9NDAwMDAwOwp2YXIKICAgTiwgUSwgcmljb3JkYSwgY29udGEsY29udGF6b25lLGEgLGIsIGgsaSwgaiwgdywgeix4LCB5LCByaXN1bDogbG9uZ2ludDsKICAgZ3JhcGggOiBhcnJheVswLi5NQVhOLTFdIG9mIGFycmF5IG9mIGxvbmdpbnQ7CiAgIGdzaXplLCBnY2FwYTogYXJyYXlbMC4uTUFYTi0xXSBvZiBsb25naW50OwogICB2aXNpdGVkIDogYXJyYXlbMC4uTUFYTi0xXSBvZiBib29sZWFuOwogICBTLEUsZGlzdCA6IGFycmF5WzAuLk1BWE4tMV0gb2YgbG9uZ2ludDsKICAgcTEsIHEyIDogYXJyYXlbMC4uUVNJWkUtMV0gb2YgbG9uZ2ludDsKICAgdXNjaXRhOiBib29sZWFuOwogICAKcHJvY2VkdXJlIGJmcyhiIDogbG9uZ2ludDsgdmFyIHJlcyA6IGFycmF5IG9mIGxvbmdpbnQpOwogdmFyIHFoZWFkLCBxY291bnQsIGZpcnN0LCBzZWNvbmQsIGogOiBsb25naW50OwogICAKIGJlZ2luCiAgIHExWzBdIDo9IGI7IHEyWzBdIDo9IDA7CiAgIHFoZWFkIDo9IDA7IHFjb3VudCA6PSAxOwogICB3aGlsZSBxY291bnQgPiAwIGRvCiAgICAgICBiZWdpbgogICAgICAgICBmaXJzdCA6PSBxMVtxaGVhZF07CiAgICAgICAgIHNlY29uZCA6PSBxMltxaGVhZF07CiAgICAgICAgIGluYyhxaGVhZCk7CiAgICAgICAgIGlmIHFoZWFkID0gUVNJWkUgdGhlbgogICAgICAgICBxaGVhZCA6PSAwOwogICAgICAgICBkZWMocWNvdW50KTsKICAgICAgICAgaWYgdmlzaXRlZFtmaXJzdF0gdGhlbgogICAgICAgICBjb250aW51ZTsKICAgICAgICAgdmlzaXRlZFtmaXJzdF0gOj0gVHJ1ZTsgcmljb3JkYTo9Zmlyc3Q7CiAgICAgICAgIGNvbnRhOj1jb250YSsxOyAoKm1lbW9yaXp6YSBpbCBudW1lcm8gZGkgbm9kaSB2aXNpdGF0aSopCiAgICAgICAgIHJlc1tmaXJzdF0gOj0gc2Vjb25kOwogICAgICAgICBmb3Igajo9MCB0byBnc2l6ZVtmaXJzdF0tMSBkbwogICAgICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgICAgcTFbKHFoZWFkICsgcWNvdW50KSBtb2QgUVNJWkVdIDo9IGdyYXBoW2ZpcnN0XVtqXTsKICAgICAgICAgICAgICAgICBxMlsocWhlYWQgKyBxY291bnQpIG1vZCBRU0laRV0gOj0gc2Vjb25kICsgMTsKICAgICAgICAgICAgICAgICBpbmMocWNvdW50KTsKICAgICAgICAgICAgICAgIGVuZDsKICAgICAgIGVuZDsKIGVuZDsKCnByb2NlZHVyZSBpbml6aWEgKE46IGxvbmdpbnQpOwpiZWdpbgogZm9yIGg6PTAgdG8gTi0xIGRvCiAgICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICBzZXRsZW5ndGgoZ3JhcGhbaF0sIDEpOwogICAgICAgICAgICAgICAgKCogYWxs4oCZaW5pemlvLCBsYSBsaXN0YSBkaSBhZGlhY2VuemEgZGVsIG5vZG8gaSBoYSBkaW1lbnNpb25lIDAKICAgICAgICAgICAgICAgICAgKiBlIGNhcGFjaXRh4oCZIDEuICopCiAgICAgICAgICAgICAgICBnc2l6ZVtoXSA6PSAwOwogICAgIGdjYXBhW2hdIDo9IDE7CiAgICAgZGlzdFtoXSA6PSBtYXhsb25naW50OwogIGVuZDsKZW5kOyAgCgpmdW5jdGlvbiBjb2xsZWdhICh4LHk6bG9uZ2ludCk6bG9uZ2ludDsKYmVnaW4KICBTW2ldOj14OyBFW2ldOj15OwogICAgICAgajo9MTsKICAgICAgIHdoaWxlIGo8PVEgZG8gCiAgICAgICAgIGJlZ2luCiAgICAgICAgICBmb3IgaDo9MCB0byBOLTEgZG8gdmlzaXRlZFtoXTo9ZmFsc2U7CiAgICAgICAgICBpbml6aWEoTik7CiAgICAgICAgICBmb3IgaDo9MCB0byBqLTEgZG8KICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgIGEgOj0gU1toXTsgYiA6PUVbaF07CiAgICAgICAgICAgICAgKCogc2UgaG8gZXNhdXJpdG8gaSBwb3N0aSBuZWxsYSBsaXN0YSBkaSBhZGlhY2VuemEgZGVsIG5vZG8gYSAqKQogICAgICAgICAgICAgIGlmIGdzaXplW2FdID0gZ2NhcGFbYV0gdGhlbgogICAgICAgICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICAgICAgICAgKCogYWxsb3JhIHJhZGRvcHBpbyBsYSBzdWEgY2FwYWNpdGHigJkgKikKICAgICAgICAgICAgICAgICAgICAgICAgZ2NhcGFbYV0gOj0gZ2NhcGFbYV0gc2hsIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldGxlbmd0aChncmFwaFthXSwgZ2NhcGFbYV0pOwogICAgICAgICAgICAgICAgICAgICBlbmQ7CiAgICAgICAgICAgICAgZ3JhcGhbYV1bZ3NpemVbYV1dIDo9IGI7CiAgICAgICAgICAgICAgaW5jKGdzaXplW2FdKTsKICAgICAgICAgICAgICAoKiBzZSBobyBlc2F1cml0byBpIHBvc3RpIG5lbGxhIGxpc3RhIGRpIGFkaWFjZW56YSBkZWwgbm9kbyBiICopCiAgICAgICAgICAgICAgaWYgZ3NpemVbYl0gPSBnY2FwYVtiXSB0aGVuCiAgICAgICAgICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICAgICAgICgqIGFsbG9yYSByYWRkb3BwaW8gbGEgc3VhIGNhcGFjaXRh4oCZICopCiAgICAgICAgICAgICAgICAgICAgZ2NhcGFbYl0gOj0gZ2NhcGFbYl0gc2hsIDE7CiAgICAgICAgICAgICAgICAgICAgc2V0bGVuZ3RoKGdyYXBoW2JdLCBnY2FwYVtiXSk7CiAgICAgICAgICAgICAgICAgICBlbmQ7CiAgICAgICAgICAgICAgZ3JhcGhbYl1bZ3NpemVbYl1dIDo9YTsKICAgICAgICAgICAgICBpbmMoZ3NpemVbYl0pOwogICAgICAgICAgIGVuZDsKICAgICAgICBjb250YXpvbmU6PTE7IGNvbnRhOj0wOyAKICAgICAgICBiZnMoMCxkaXN0KTsKICAgICAgICB3aGlsZSBjb250YTxOIGRvCiAgICAgICAgICAgICAgICAgICAgYmVnaW4gCiAgICAgICAgICAgICAgICAgICAgICAgIHc6PTA7IHVzY2l0YTo9ZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhem9uZTo9Y29udGF6b25lKzE7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICh1c2NpdGE9ZmFsc2UpIGFuZCAodzxOKSBkbyAgaWYgdmlzaXRlZFt3XT10cnVlIHRoZW4gdzo9dysxCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgYmVnaW4gIHVzY2l0YTo9dHJ1ZTtyaWNvcmRhOj13OyBlbmQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGJmcyhyaWNvcmRhLGRpc3QpOwogICAgICAgICAgICAgICAgICAgIGVuZDsgCiAgICAgICAgY29sbGVnYTo9Y29udGF6b25lOyBqOj1qKzE7IGVuZDsgCiBlbmQ7CiAKYmVnaW4KICAgKCphc3NpZ24oaW5wdXQsICdpbnB1dC50eHQnKTsgcmVzZXQoaW5wdXQpOwogICBhc3NpZ24ob3V0cHV0LCAnb3V0cHV0LnR4dCcpOyByZXdyaXRlKG91dHB1dCk7KikKICAgcmVhZGxuKE4sIFEpOwogICBpbml6aWEoTik7CiAgIGZvciBpOj0wIHRvIFEtMSBkbyAKICAgICAgYmVnaW4gCiAgICAgICByZWFkbG4gKHgseSk7CiAgICAgICB3cml0ZWxuIChjb2xsZWdhKHgseSkpOwogICAgICBlbmQ7CmVuZC4K