@@ -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
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,27 +189,19 @@ 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
-
193
- void dfs(int v, int l, int r, vector<ll>& ans){
192
+ void dfs(int v, int l, int r, vector<ll> &ans) {
194
193
int snapshot = dsu.snapshot();
195
194
// perform all available operations upon entering
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){
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) {
205
200
// answer type 3 query if we have one
206
- for(Query& q: tree[v]){
207
- if(q.t == 3){
208
- ans[l] = dsu.sum[dsu.get(q.v)];
209
- }
201
+ for (Query &q : tree[v]) {
202
+ if (q.t == 3) { ans[l] = dsu.sum[dsu.get(q.v)]; }
210
203
}
211
- }
212
- else{
204
+ } else {
213
205
// go deeper into the tree
214
206
int m = (l + r) / 2;
215
207
dfs(2 * v, l, m, ans);
@@ -220,55 +212,57 @@ void dfs(int v, int l, int r, vector<ll>& ans){
220
212
}
221
213
222
214
int main() {
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;
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;
227
221
dsu.sum[i] = x;
228
222
}
229
223
map<pair<int, int>, int> index_added;
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);
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);
235
231
// store index this edge is added, marks beginning of interval
236
232
index_added[{u, v}] = i;
237
- }
238
- else if(t == 1){
239
- int u, v; cin >> u >> v;
240
- if(u > v) swap(u, v);
233
+ } else if (t == 1) {
234
+ int u, v;
235
+ cin >> u >> v;
236
+ if (u > v) swap(u, v);
241
237
Query cur_q = {1, u, v};
242
238
// add all edges that are deleted to interval [index added, i - 1]
243
239
update(cur_q, 1, index_added[{u, v}], i - 1, 0, q - 1);
244
240
index_added[{u, v}] = -1;
245
- }
246
- else if(t == 2){
247
- int v, x; cin >> v >> x;
241
+ } else if (t == 2) {
242
+ int v, x;
243
+ cin >> v >> x;
248
244
Query cur_q = {2, -1, v, x};
249
245
// add all sum queries to interval [i, q - 1]
250
246
update(cur_q, 1, i, q - 1, 0, q - 1);
251
- }
252
- else{
253
- int v; cin >> v;
247
+ } else {
248
+ int v;
249
+ cin >> v;
254
250
Query cur_q = {3, -1, v};
255
251
// add all output queries to interval [i, i]
256
252
update(cur_q, 1, i, i, 0, q - 1);
257
253
}
258
254
}
259
255
// add all edges that are not deleted to interval [index added, q - 1]
260
- for(auto [edge, index]: index_added){
261
- if(index != -1){
256
+ for (auto [edge, index] : index_added) {
257
+ if (index != -1) {
262
258
Query cur_q = {1, edge.first, edge.second};
263
259
update(cur_q, 1, index, q - 1, 0, q - 1);
264
260
}
265
261
}
266
262
vector<ll> ans(q, -1);
267
263
dfs(1, 0, q - 1, ans);
268
- for(int i = 0; i < q; i++){
269
- if(ans[i] != -1){
270
- cout << ans[i] << "\n ";
271
- }
264
+ for (int i = 0; i < q; i++) {
265
+ if (ans[i] != -1) { cout << ans[i] << "\n "; }
272
266
}
273
267
}
274
268
` ` `
0 commit comments