@@ -216,8 +216,9 @@ struct Treap { int lc, rc, pri, size, key; long sum; };
216
216
unique_ptr<Treap[]> tr;
217
217
218
218
void mconcat (int x) {
219
- tr[x].size = tr[tr[x].lc ].size + 1 + tr[tr[x].rc ].size ;
220
- tr[x].sum = tr[tr[x].lc ].sum + tr[x].key + tr[tr[x].rc ].sum ;
219
+ int l = tr[x].lc , r = tr[x].rc ;
220
+ tr[x].size = tr[l].size + 1 + tr[r].size ;
221
+ tr[x].sum = tr[l].sum + tr[x].key + tr[r].sum ;
221
222
}
222
223
223
224
void split_by_rank (int x, int k, int &l, int &r) {
@@ -235,7 +236,7 @@ void split_by_rank(int x, int k, int &l, int &r) {
235
236
236
237
void split_by_key (int x, int key, int &l, int &r) {
237
238
if (!x) return void (l = r = 0 );
238
- if (key <= tr[x].key ) {
239
+ if (key < tr[x].key ) {
239
240
r = x;
240
241
split_by_key (tr[x].lc , key, l, tr[x].lc );
241
242
} else {
@@ -247,52 +248,51 @@ void split_by_key(int x, int key, int &l, int &r) {
247
248
248
249
int join (int x, int y) {
249
250
if (!x || !y) return x^y;
250
- if (tr[x].pri < tr[y].pri ) {
251
+ if (tr[x].pri < tr[y].pri )
251
252
tr[x].rc = join (tr[x].rc , y);
252
- mconcat (x);
253
- return x;
254
- } else {
253
+ else {
255
254
tr[y].lc = join (x, tr[y].lc );
256
- mconcat (y);
257
- return y;
255
+ x = y;
258
256
}
257
+ mconcat (x);
258
+ return x;
259
259
}
260
260
}
261
261
262
262
class MKAverage {
263
- int m, k, id, root = 0 ;
263
+ int m, k, root = 0 ;
264
264
deque<int > q;
265
-
266
- int erase (int x, int k) {
267
- if (k == tr[x].key ) {
268
- int ret = join (tr[x].lc , tr[x].rc );
269
- id = x;
265
+ int erase (int &x, int key) {
266
+ if (tr[x].key == key) {
267
+ int ret = x;
268
+ x = join (tr[x].lc , tr[x].rc );
270
269
return ret;
271
270
}
272
- if (k < tr[x].key )
273
- tr[x].lc = erase (tr[x].lc , k);
271
+ int id;
272
+ if (key < tr[x].key )
273
+ id = erase (tr[x].lc , key);
274
274
else
275
- tr[x]. rc = erase (tr[x].rc , k );
275
+ id = erase (tr[x].rc , key );
276
276
mconcat (x);
277
- return x ;
277
+ return id ;
278
278
}
279
279
public:
280
- MKAverage (int m, int k) : m(m), k(k) { tr = make_unique<Treap[]>(m+1 ); }
280
+ MKAverage (int m, int k) : m(m), k(k) {
281
+ tr = make_unique<Treap[]>(m+1 );
282
+ }
281
283
282
284
void addElement (int num) {
283
- int l, r;
284
- id = q.size ()+1 ;
285
+ int l, r, id = q.size ()+1 ;
285
286
if (q.size () == m) {
286
- int key = q.front ();
287
+ id = erase (root, q.front () );
287
288
q.pop_front ();
288
- root = erase (root, key);
289
289
}
290
290
tr[id].lc = tr[id].rc = 0 ;
291
291
tr[id].pri = xor32 ();
292
292
tr[id].size = 1 ;
293
293
tr[id].key = tr[id].sum = num;
294
294
split_by_key (root, num, l, r);
295
- root = join (l, join (id , r) );
295
+ root = join (join ( l, id) , r);
296
296
q.push_back (num);
297
297
}
298
298
0 commit comments