<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=3339_%E2%80%93_Disjoint1</id>
	<title>3339 – Disjoint1 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.universitas.ro/index.php?action=history&amp;feed=atom&amp;title=3339_%E2%80%93_Disjoint1"/>
	<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3339_%E2%80%93_Disjoint1&amp;action=history"/>
	<updated>2026-05-01T03:42:13Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.universitas.ro/index.php?title=3339_%E2%80%93_Disjoint1&amp;diff=8922&amp;oldid=prev</id>
		<title>Corjuc Eunice: Pagină nouă: Se consideră un graf cu &lt;code&gt;N&lt;/code&gt; noduri numerotate de la &lt;code&gt;1&lt;/code&gt; la &lt;code&gt;N&lt;/code&gt; și &lt;code&gt;M&lt;/code&gt; operații de trei tipuri:  * &lt;code&gt;1 x y&lt;/code&gt; – se adaugă în graf muchia &lt;code&gt;(x, y)&lt;/code&gt;. Dacă muchia există deja, operația nu se efectuează * &lt;code&gt;2 x y&lt;/code&gt; – întrebare: nodurile &lt;code&gt;x&lt;/code&gt; și &lt;code&gt;y&lt;/code&gt; se află sau nu în aceeași componentă conexă? * &lt;code&gt;3&lt;/code&gt; – întrebare: care este numărul maxim de noduri dintr-o com...</title>
		<link rel="alternate" type="text/html" href="https://wiki.universitas.ro/index.php?title=3339_%E2%80%93_Disjoint1&amp;diff=8922&amp;oldid=prev"/>
		<updated>2024-01-03T21:01:52Z</updated>

		<summary type="html">&lt;p&gt;Pagină nouă: Se consideră un graf cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; operații de trei tipuri:  * &amp;lt;code&amp;gt;1 x y&amp;lt;/code&amp;gt; – se adaugă în graf muchia &amp;lt;code&amp;gt;(x, y)&amp;lt;/code&amp;gt;. Dacă muchia există deja, operația nu se efectuează * &amp;lt;code&amp;gt;2 x y&amp;lt;/code&amp;gt; – întrebare: nodurile &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; se află sau nu în aceeași componentă conexă? * &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; – întrebare: care este numărul maxim de noduri dintr-o com...&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;Se consideră un graf cu &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; noduri numerotate de la &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; la &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; operații de trei tipuri:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;1 x y&amp;lt;/code&amp;gt; – se adaugă în graf muchia &amp;lt;code&amp;gt;(x, y)&amp;lt;/code&amp;gt;. Dacă muchia există deja, operația nu se efectuează&lt;br /&gt;
* &amp;lt;code&amp;gt;2 x y&amp;lt;/code&amp;gt; – întrebare: nodurile &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; se află sau nu în aceeași componentă conexă?&lt;br /&gt;
* &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; – întrebare: care este numărul maxim de noduri dintr-o componentă conexă?&lt;br /&gt;
&lt;br /&gt;
= Cerința =&lt;br /&gt;
Trebuie să răspundeți la toate întrebările de tip &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Date de intrare =&lt;br /&gt;
Programul citește de la tastatură numerele &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt;, iar pe următoarele &amp;lt;code&amp;gt;M&amp;lt;/code&amp;gt; linii se află operațiile date fie prin trei valori de forma &amp;lt;code&amp;gt;op x y&amp;lt;/code&amp;gt; (pentru operațiile de tip &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt;), fie printr-o singură valoare &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt; (pentru operațiile de tip &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
= Date de ieșire =&lt;br /&gt;
Programul va afișa pe ecran, pe câte o linie, răspunsul la fiecare întrebare de tip &amp;lt;code&amp;gt;2&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;3&amp;lt;/code&amp;gt;. Dacă la o întrebare &amp;lt;code&amp;gt;2 x y&amp;lt;/code&amp;gt; răspunsul este afirmativ, adică &amp;lt;code&amp;gt;x&amp;lt;/code&amp;gt; și &amp;lt;code&amp;gt;y&amp;lt;/code&amp;gt; se află în aceeași componentă conexă, atunci veți afișa &amp;lt;code&amp;gt;DA&amp;lt;/code&amp;gt;, iar în caz contrar veți afișa &amp;lt;code&amp;gt;NU&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
= Restricții și precizări =&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;code&amp;gt;3 ≤ N ≤ 32.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;3 ≤ M ≤ 300.000&amp;lt;/code&amp;gt;&lt;br /&gt;
* va exista cel puțin o operație de fiecare tip.&lt;br /&gt;
&lt;br /&gt;
== Exemplul 1 ==&lt;br /&gt;
Input:&lt;br /&gt;
&lt;br /&gt;
6 6&lt;br /&gt;
&lt;br /&gt;
1 1 4&lt;br /&gt;
&lt;br /&gt;
1 3 6&lt;br /&gt;
&lt;br /&gt;
2 4 6&lt;br /&gt;
&lt;br /&gt;
1 1 3&lt;br /&gt;
&lt;br /&gt;
2 4 6&lt;br /&gt;
&lt;br /&gt;
3&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&lt;br /&gt;
NU&lt;br /&gt;
&lt;br /&gt;
DA&lt;br /&gt;
&lt;br /&gt;
4&lt;br /&gt;
&lt;br /&gt;
== Exemplul 2 ==&lt;br /&gt;
Input:&lt;br /&gt;
&lt;br /&gt;
99999999 6&lt;br /&gt;
&lt;br /&gt;
1 1 4&lt;br /&gt;
&lt;br /&gt;
1 3 6&lt;br /&gt;
&lt;br /&gt;
2 4 6&lt;br /&gt;
&lt;br /&gt;
1 1 3&lt;br /&gt;
&lt;br /&gt;
2 4 6&lt;br /&gt;
&lt;br /&gt;
3&lt;br /&gt;
&lt;br /&gt;
Output:&lt;br /&gt;
&lt;br /&gt;
Invalid input. Please ensure that 3 ≤ N ≤ 32,000 and 3 ≤ M ≤ 300,000.&lt;br /&gt;
&lt;br /&gt;
== Rezolvare ==&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python3&amp;quot; line=&amp;quot;1&amp;quot;&amp;gt;&lt;br /&gt;
def verify_conditions(N, M):&lt;br /&gt;
    return 3 &amp;lt;= N &amp;lt;= 32000 and 3 &amp;lt;= M &amp;lt;= 300000&lt;br /&gt;
&lt;br /&gt;
class UnionFind:&lt;br /&gt;
    def __init__(self, n):&lt;br /&gt;
        self.parent = list(range(n + 1))&lt;br /&gt;
        self.rank = [0] * (n + 1)&lt;br /&gt;
        self.size = [1] * (n + 1)&lt;br /&gt;
        self.max_size = 1&lt;br /&gt;
&lt;br /&gt;
    def find(self, x):&lt;br /&gt;
        if self.parent[x] != x:&lt;br /&gt;
            self.parent[x] = self.find(self.parent[x])&lt;br /&gt;
        return self.parent[x]&lt;br /&gt;
&lt;br /&gt;
    def union(self, x, y):&lt;br /&gt;
        root_x = self.find(x)&lt;br /&gt;
        root_y = self.find(y)&lt;br /&gt;
&lt;br /&gt;
        if root_x != root_y:&lt;br /&gt;
            if self.rank[root_x] &amp;lt; self.rank[root_y]:&lt;br /&gt;
                root_x, root_y = root_y, root_x&lt;br /&gt;
            self.parent[root_y] = root_x&lt;br /&gt;
            self.size[root_x] += self.size[root_y]&lt;br /&gt;
            self.max_size = max(self.max_size, self.size[root_x])&lt;br /&gt;
            if self.rank[root_x] == self.rank[root_y]:&lt;br /&gt;
                self.rank[root_x] += 1&lt;br /&gt;
&lt;br /&gt;
def main():&lt;br /&gt;
    N = int(input())&lt;br /&gt;
    M = int(input())&lt;br /&gt;
&lt;br /&gt;
    if not verify_conditions(N, M):&lt;br /&gt;
        print(&amp;quot;Invalid input. Please ensure that 3 ≤ N ≤ 32,000 and 3 ≤ M ≤ 300,000.&amp;quot;)&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    union_find = UnionFind(N)&lt;br /&gt;
&lt;br /&gt;
    for _ in range(M):&lt;br /&gt;
        input_values = input().split()&lt;br /&gt;
        operation = int(input_values[0])&lt;br /&gt;
&lt;br /&gt;
        if operation == 1:&lt;br /&gt;
            x, y = int(input_values[1]), int(input_values[2])&lt;br /&gt;
            union_find.union(x, y)&lt;br /&gt;
        elif operation == 2:&lt;br /&gt;
            x, y = int(input_values[1]), int(input_values[2])&lt;br /&gt;
            result = &amp;quot;DA&amp;quot; if union_find.find(x) == union_find.find(y) else &amp;quot;NU&amp;quot;&lt;br /&gt;
            print(result)&lt;br /&gt;
        elif operation == 3:&lt;br /&gt;
            print(union_find.max_size)&lt;br /&gt;
&lt;br /&gt;
if __name__ == &amp;quot;__main__&amp;quot;:&lt;br /&gt;
    main()&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Corjuc Eunice</name></author>
	</entry>
</feed>