@@ -172,15 +172,15 @@ const int MAXN = 3e5 + 5;
172
172
173
173
DSU dsu(MAXN);
174
174
175
- struct query {
175
+ struct Query {
176
176
int t, u, v, x;
177
177
};
178
178
179
- vector<query > tree[MAXN * 4];
179
+ vector<Query > tree[MAXN * 4];
180
180
181
- void update(query & q, int v, int l, int r, int L, int R) {
182
- if (l > R || r < L) return;
183
- if (l <= L && r >= R) {
181
+ void update(Query& q, int v, int l, int r, int L, int R){
182
+ if(l > R || r < L) return;
183
+ if(l <= L && r >= R){
184
184
tree[v].push_back(q);
185
185
return;
186
186
}
@@ -189,19 +189,27 @@ void update(query &q, int v, int l, int r, int L, int R) {
189
189
update(q, v * 2 + 1, l, r, m + 1, R);
190
190
}
191
191
192
- void dfs(int v, int l, int r, vector<ll> &ans) {
192
+
193
+ void dfs(int v, int l, int r, vector<ll>& ans){
193
194
int snapshot = dsu.snapshot();
194
195
// perform all available operations upon entering
195
- for (query &q : tree[v]) {
196
- if (q.t == 1) { dsu.unite(q.u, q.v); }
197
- if (q.t == 2) { dsu.add(q.v, q.x); }
198
- }
199
- if (l == r) {
196
+ for(Query& q: tree[v]){
197
+ if(q.t == 1){
198
+ dsu.unite(q.u, q.v);
199
+ }
200
+ if(q.t == 2){
201
+ dsu.add(q.v, q.x);
202
+ }
203
+ }
204
+ if(l == r){
200
205
// answer type 3 query if we have one
201
- for (query &q : tree[v]) {
202
- if (q.t == 3) { ans[l] = dsu.sum[dsu.get(q.v)]; }
206
+ for(Query& q: tree[v]){
207
+ if(q.t == 3){
208
+ ans[l] = dsu.sum[dsu.get(q.v)];
209
+ }
203
210
}
204
- } else {
211
+ }
212
+ else{
205
213
// go deeper into the tree
206
214
int m = (l + r) / 2;
207
215
dfs(2 * v, l, m, ans);
@@ -212,57 +220,55 @@ void dfs(int v, int l, int r, vector<ll> &ans) {
212
220
}
213
221
214
222
int main() {
215
- cin.tie(0)->sync_with_stdio(0);
216
- int n, q;
217
- cin >> n >> q;
218
- for (int i = 0; i < n; i++) {
219
- ll x;
220
- cin >> x;
223
+ cin.tie(0) -> sync_with_stdio(0);
224
+ int n, q; cin >> n >> q;
225
+ for(int i = 0; i < n; i++){
226
+ ll x; cin >> x;
221
227
dsu.sum[i] = x;
222
228
}
223
229
map<pair<int, int>, int> index_added;
224
- for (int i = 0; i < q; i++) {
225
- int t;
226
- cin >> t;
227
- if (t == 0) {
228
- int u, v;
229
- cin >> u >> v;
230
- if (u > v) swap(u, v);
230
+ for(int i = 0; i < q; i++){
231
+ int t; cin >> t;
232
+ if(t == 0){
233
+ int u, v; cin >> u >> v;
234
+ if(u > v) swap(u, v);
231
235
// store index this edge is added, marks beginning of interval
232
236
index_added[{u, v}] = i;
233
- } else if (t == 1) {
234
- int u, v;
235
- cin >> u >> v;
236
- if (u > v) swap(u, v);
237
- query cur_q = {1, u, v};
237
+ }
238
+ else if(t == 1){
239
+ int u, v; cin >> u >> v;
240
+ if(u > v) swap(u, v);
241
+ Query cur_q = {1, u, v};
238
242
// add all edges that are deleted to interval [index added, i - 1]
239
243
update(cur_q, 1, index_added[{u, v}], i - 1, 0, q - 1);
240
244
index_added[{u, v}] = -1;
241
- } else if (t == 2) {
242
- int v, x;
243
- cin >> v >> x;
244
- query cur_q = {2, -1, v, x};
245
+ }
246
+ else if(t == 2){
247
+ int v, x; cin >> v >> x;
248
+ Query cur_q = {2, -1, v, x};
245
249
// add all sum queries to interval [i, q - 1]
246
250
update(cur_q, 1, i, q - 1, 0, q - 1);
247
- } else {
248
- int v;
249
- cin >> v;
250
- query cur_q = {3, -1, v};
251
+ }
252
+ else{
253
+ int v; cin >> v;
254
+ Query cur_q = {3, -1, v};
251
255
// add all output queries to interval [i, i]
252
256
update(cur_q, 1, i, i, 0, q - 1);
253
257
}
254
258
}
255
259
// add all edges that are not deleted to interval [index added, q - 1]
256
- for (auto [edge, index] : index_added) {
257
- if (index != -1) {
258
- query cur_q = {1, edge.first, edge.second};
260
+ for(auto [edge, index]: index_added){
261
+ if(index != -1){
262
+ Query cur_q = {1, edge.first, edge.second};
259
263
update(cur_q, 1, index, q - 1, 0, q - 1);
260
264
}
261
265
}
262
266
vector<ll> ans(q, -1);
263
267
dfs(1, 0, q - 1, ans);
264
- for (int i = 0; i < q; i++) {
265
- if (ans[i] != -1) { cout << ans[i] << "\n "; }
268
+ for(int i = 0; i < q; i++){
269
+ if(ans[i] != -1){
270
+ cout << ans[i] << "\n ";
271
+ }
266
272
}
267
273
}
268
274
` ` `
0 commit comments