@@ -110,30 +110,18 @@ int v[MAXN], ans[MAXN], cc, cc2;
110
110
Query Q[MAXN];
111
111
UnionFind UF;
112
112
113
- // Para o UF 1
114
- void add ( int p) {
113
+ void add ( int p, int k, int &c){
114
+
115
115
int u = edge[p].fi , v = edge[p].se ;
116
116
117
- bool r = UF.sameSet (u,v,0 );
117
+ bool r = UF.sameSet (u,v,k );
118
118
119
119
if (!r){
120
- UF.unir (u,v,0 );
121
- cc --;
120
+ UF.unir (u,v,k );
121
+ c --;
122
122
}
123
123
}
124
124
125
- // Para o UF 2
126
- void add2 (int p) {
127
- int u = edge[p].fi , v = edge[p].se ;
128
-
129
- bool r = UF.sameSet (u,v,1 );
130
-
131
- if (!r) {
132
- cc2--;
133
- UF.unir (u,v,1 );
134
- }
135
- }
136
-
137
125
void MO (){
138
126
sort (Q, Q+K);
139
127
@@ -162,20 +150,20 @@ void MO(){
162
150
rMO = l-1 ;
163
151
lMO = l;
164
152
165
- while (rMO < r) add2 (++rMO);
153
+ while (rMO < r) add (++rMO, 1 , cc2 );
166
154
167
155
rMO = min (M , (l/t) * t + t -1 );
168
156
}
169
157
else {
170
158
lMO = min (M , (l/t) * t + t);
171
159
172
160
// To adicionando do r anterior até r o r atual
173
- while (rMO < r) add (++rMO);
161
+ while (rMO < r) add (++rMO, 0 , cc );
174
162
175
163
cc2 = cc;
176
164
177
165
// To adicionando da l até SQRT
178
- while (lMO > l) add2 (--lMO);
166
+ while (lMO > l) add (--lMO, 1 , cc2 );
179
167
}
180
168
181
169
// Reseto a todo momento o UF2 por causa do l
0 commit comments