program oli3_riconnessioneconbfs; (* ricerca del numero di componenti connessi su grafo semplice risolto con lista di adiacenza e bfs*)
const MAXN =100000;
Qsize=200000;
var
N, Q, ricorda, conta,contacomponenti,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;
contacomponenti:=1; conta:=0;
bfs(0,dist);
while conta<N do
begin
w:=0; uscita:=false;
contacomponenti:=contacomponenti+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:=contacomponenti; 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.
cHJvZ3JhbSBvbGkzX3JpY29ubmVzc2lvbmVjb25iZnM7ICgqIHJpY2VyY2EgZGVsIG51bWVybyBkaSBjb21wb25lbnRpIGNvbm5lc3NpIHN1ICBncmFmbyBzZW1wbGljZSByaXNvbHRvIGNvbiBsaXN0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGkgYWRpYWNlbnphIGUgYmZzKikKY29uc3QgTUFYTiA9MTAwMDAwOwogICAgICBRc2l6ZT0yMDAwMDA7CnZhcgogICBOLCBRLCByaWNvcmRhLCBjb250YSxjb250YWNvbXBvbmVudGksYSAsYiwgaCxpLCBqLCB3LCB6LHgsIHksIHJpc3VsOiBsb25naW50OwogICBncmFwaCA6IGFycmF5WzAuLk1BWE4tMV0gb2YgYXJyYXkgb2YgbG9uZ2ludDsKICAgZ3NpemUsIGdjYXBhOiBhcnJheVswLi5NQVhOLTFdIG9mIGxvbmdpbnQ7CiAgIHZpc2l0ZWQgOiBhcnJheVswLi5NQVhOLTFdIG9mIGJvb2xlYW47CiAgIFMsRSxkaXN0IDogYXJyYXlbMC4uTUFYTi0xXSBvZiBsb25naW50OwogICBxMSwgcTIgOiBhcnJheVswLi5RU0laRS0xXSBvZiBsb25naW50OwogICB1c2NpdGE6IGJvb2xlYW47CiAgIApwcm9jZWR1cmUgYmZzKGIgOiBsb25naW50OyB2YXIgcmVzIDogYXJyYXkgb2YgbG9uZ2ludCk7CiB2YXIgcWhlYWQsIHFjb3VudCwgZmlyc3QsIHNlY29uZCwgaiA6IGxvbmdpbnQ7CiAgIAogYmVnaW4KICAgcTFbMF0gOj0gYjsgcTJbMF0gOj0gMDsKICAgcWhlYWQgOj0gMDsgcWNvdW50IDo9IDE7CiAgIHdoaWxlIHFjb3VudCA+IDAgZG8KICAgICAgIGJlZ2luCiAgICAgICAgIGZpcnN0IDo9IHExW3FoZWFkXTsKICAgICAgICAgc2Vjb25kIDo9IHEyW3FoZWFkXTsKICAgICAgICAgaW5jKHFoZWFkKTsKICAgICAgICAgaWYgcWhlYWQgPSBRU0laRSB0aGVuCiAgICAgICAgIHFoZWFkIDo9IDA7CiAgICAgICAgIGRlYyhxY291bnQpOwogICAgICAgICBpZiB2aXNpdGVkW2ZpcnN0XSB0aGVuCiAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB2aXNpdGVkW2ZpcnN0XSA6PSBUcnVlOyByaWNvcmRhOj1maXJzdDsKICAgICAgICAgY29udGE6PWNvbnRhKzE7ICgqbWVtb3JpenphIGlsIG51bWVybyBkaSBub2RpIHZpc2l0YXRpKikKICAgICAgICAgcmVzW2ZpcnN0XSA6PSBzZWNvbmQ7CiAgICAgICAgIGZvciBqOj0wIHRvIGdzaXplW2ZpcnN0XS0xIGRvCiAgICAgICAgICAgICAgICAgYmVnaW4KICAgICAgICAgICAgICAgICBxMVsocWhlYWQgKyBxY291bnQpIG1vZCBRU0laRV0gOj0gZ3JhcGhbZmlyc3RdW2pdOwogICAgICAgICAgICAgICAgIHEyWyhxaGVhZCArIHFjb3VudCkgbW9kIFFTSVpFXSA6PSBzZWNvbmQgKyAxOwogICAgICAgICAgICAgICAgIGluYyhxY291bnQpOwogICAgICAgICAgICAgICAgZW5kOwogICAgICAgZW5kOwogZW5kOwoKcHJvY2VkdXJlIGluaXppYSAoTjogbG9uZ2ludCk7CmJlZ2luCiBmb3IgaDo9MCB0byBOLTEgZG8KICAgICAgICAgICAgIGJlZ2luCiAgICAgICAgICAgICAgIHNldGxlbmd0aChncmFwaFtoXSwgMSk7CiAgICAgICAgICAgICAgICAoKiBhbGzigJlpbml6aW8sIGxhIGxpc3RhIGRpIGFkaWFjZW56YSBkZWwgbm9kbyBpIGhhIGRpbWVuc2lvbmUgMAogICAgICAgICAgICAgICAgICAqIGUgY2FwYWNpdGHigJkgMS4KICAgICAgICAgICAgICAgICAgICAqKQogICAgICAgICAgICAgICAgZ3NpemVbaF0gOj0gMDsKICAgICBnY2FwYVtoXSA6PSAxOwogICAgIGRpc3RbaF0gOj0gbWF4bG9uZ2ludDsKICBlbmQ7CmVuZDsgIApmdW5jdGlvbiBjb2xsZWdhICh4LHk6bG9uZ2ludCk6bG9uZ2ludDsKYmVnaW4KICBTW2ldOj14OyBFW2ldOj15OwogICAgICAgajo9MTsKICAgICAgIHdoaWxlIGo8PVEgZG8gYmVnaW4KICAgICAgICAgIGZvciBoOj0wIHRvIE4tMSBkbyB2aXNpdGVkW2hdOj1mYWxzZTsKICAgICAgICAgIGluaXppYShOKTsKIGZvciBoOj0wIHRvIGotMSBkbwogICAgICBiZWdpbgogICAgICAgYSA6PSBTW2hdOyBiIDo9RVtoXTsKICAgICAgICgqIHNlIGhvIGVzYXVyaXRvIGkgcG9zdGkgbmVsbGEgbGlzdGEgZGkgYWRpYWNlbnphIGRlbCBub2RvIGEgKikKICAgICAgIGlmIGdzaXplW2FdID0gZ2NhcGFbYV0gdGhlbgogICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICgqIGFsbG9yYSByYWRkb3BwaW8gbGEgc3VhIGNhcGFjaXRh4oCZICopCiAgICAgICAgICAgICAgZ2NhcGFbYV0gOj0gZ2NhcGFbYV0gc2hsIDE7CiAgICAgICAgICAgICAgc2V0bGVuZ3RoKGdyYXBoW2FdLCBnY2FwYVthXSk7CiAgICAgICAgICAgIGVuZDsKICAgICAgIGdyYXBoW2FdW2dzaXplW2FdXSA6PSBiOwogICAgICAgaW5jKGdzaXplW2FdKTsKICAgICAgICgqIHNlIGhvIGVzYXVyaXRvIGkgcG9zdGkgbmVsbGEgbGlzdGEgZGkgYWRpYWNlbnphIGRlbCBub2RvIGIgKikKICAgICAgIGlmIGdzaXplW2JdID0gZ2NhcGFbYl0gdGhlbgogICAgICAgICAgICBiZWdpbgogICAgICAgICAgICAgICgqIGFsbG9yYSByYWRkb3BwaW8gbGEgc3VhIGNhcGFjaXRh4oCZICopCiAgICAgICAgICAgICAgZ2NhcGFbYl0gOj0gZ2NhcGFbYl0gc2hsIDE7CiAgICAgICAgICAgICAgc2V0bGVuZ3RoKGdyYXBoW2JdLCBnY2FwYVtiXSk7CiAgICAgICAgICAgIGVuZDsKICAgICAgIGdyYXBoW2JdW2dzaXplW2JdXSA6PWE7CiAgICAgICBpbmMoZ3NpemVbYl0pOwogICAgZW5kOwogICBjb250YWNvbXBvbmVudGk6PTE7IGNvbnRhOj0wOyAKICAgYmZzKDAsZGlzdCk7CiAgIHdoaWxlIGNvbnRhPE4gZG8KICAgICAgICAgICAgICAgICAgICBiZWdpbiAKICAgICAgICAgICAgICAgICAgICAgICAgdzo9MDsgdXNjaXRhOj1mYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGFjb21wb25lbnRpOj1jb250YWNvbXBvbmVudGkrMTsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHVzY2l0YT1mYWxzZSkgYW5kICh3PE4pIGRvICBpZiB2aXNpdGVkW3ddPXRydWUgdGhlbiB3Oj13KzEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBiZWdpbiAgdXNjaXRhOj10cnVlO3JpY29yZGE6PXc7IGVuZDsKICAgICAgICAgICAgICAgICAgICAgICAgYmZzKHJpY29yZGEsZGlzdCk7CiAgICAgICAgICAgICAgICAgICAgZW5kOyAKICAgY29sbGVnYTo9Y29udGFjb21wb25lbnRpOyBqOj1qKzE7IGVuZDsgCiAgZW5kOwogCiAKIApiZWdpbgogICAoKmFzc2lnbihpbnB1dCwgJ2lucHV0LnR4dCcpOyByZXNldChpbnB1dCk7CiAgIGFzc2lnbihvdXRwdXQsICdvdXRwdXQudHh0Jyk7IHJld3JpdGUob3V0cHV0KTsqKQogICByZWFkbG4oTiwgUSk7CiAgIGluaXppYShOKTsKICAgZm9yIGk6PTAgdG8gUS0xIGRvIAogICAgICBiZWdpbiAKICAgICAgIHJlYWRsbiAoeCx5KTsKICAgICAgIHdyaXRlbG4gKGNvbGxlZ2EoeCx5KSk7CiAgICAgIGVuZDsKZW5kLgo=