跳转至

2025 暑 TYOI 集训小记

Day 0 2025-08-03 星期日

  • 写游记

下午 15:20 的样子到的站,结果 16:00 才上地铁(?

不是我不理解,在车上看着只是乌云,怎么一出地铁就下辣么大的雨呢 \((⊙﹏⊙)\),重点是我装蚊帐的袋子还坏掉了 \((╯▔皿▔)╯\)!!!

晚上好煎熬,有好多 dalao 切了第二天的题目 %%%

回寝直接洗洗睡了,还有两个 TY 本校的。

后记,别看

为什么感觉学长的声音完全和长相不匹配啊啊啊啊啊啊

>﹏< >﹏< >﹏< >﹏< >﹏< >﹏< >﹏< >﹏< >﹏< >﹏< >﹏< >﹏< >﹏< >﹏< >﹏< >﹏< >﹏< >﹏< >﹏< >﹏< >﹏< >﹏< >﹏< >﹏< >﹏< >﹏<

Day 1 2025-08-04 星期一

单调队列、树状数组、倍增、并查集

很正常,但是当你注意到 1 蓝 16 紫 的时候,事情就不简单了。

哦,12 点了,我先吃个午饭。

啊木啊木啊木拌面真豪赤 难怪我小学托管班老师是广东的,味道一模一样 啊木啊木啊木啊木啊木啊木啊木

不对,粉丝先吃(我没图)

老师讲是讲了,但是听不懂听不懂听不懂

困困困困困困困困困困困困

王超吧今天晚上体育课整辣么大强度的体能训练,真的是疯了

后记
08/05

蛙趣,昨天体锻后没有拉伸(老师没带我们做拉伸),早上起来血量上限减半,速度减半

08/06

就算昨晚拉伸了,但是也不舒服,感觉速度又被削了,还带上了长达 29h 时长的剧毒效果。现在感觉腿是痛的。

先挂个袜子(洗了),后天再取

等会我先去食堂整点夜宵吃

啊木啊木啊木啊木

啊就像 这样

牛肉丸真豪赤

Day 2 2025-08-05 星期二

  • 写游记

先给出当天练题的题单。

上午

中午:哎不是怎么去晚了一丢丢就没拌面吃了 qwp

下午

什么是平衡树啊听不懂听不懂听不懂

什么是吉老师线段树啊听不懂听不懂听不懂

byd 第二天就往题单里塞黑题,还让不让人活了 (っ °Д °;)っ

感觉今天就在:

C++
1
2
3
4
while(1) {
    look("洛谷上的帖子");
    write("回复")
}

还在 gza 的帖子里开火了,住了管理员楼下

哦对了因为 CZOI 说有~奶龙~ 小游题,我去看了一眼,没切。

今晚体育课前半截搁哪跳舞,nmd 这下真成小舞萌了,c。

哦对了

我们跳操的时候,跳了: - 奶龙 小游

音乐中包含了: - 江南 Style

还有一些不记得,啊反正只要知道成分是十分复杂的就行。

Day 3 2025-08-06 星期三

  • 写游记

事不过三······对吧?

题单中有一道绿题。

\[ \Huge{\text{但是对个鬼啊!!!}} \]

那道绿题,是

\[ \Huge{\text{CDQ \ 分治}} \]

我玩 nm,wdnmd!c,不玩了。

回到出题组,配数据去了。配了一下午 + 一晚上,一道垃圾小题目由于我不想写高精终于被我配好了(赛题暂不公开)

哦对了,晚上有体育课,这次晚上老师让我们打八段锦(?
呆在那里,像极了体育馆里在某一种盛大的宗教盛会(?
重点是,打完太极之后又化身小舞萌(???
然后,由于我们是 B 班,然后又去打跆拳道(?????

tips

打跆拳道是从周一晚上开始的,虽然正常,但是成分复杂。

嗯,好一个综合全面发展!

Day 4 2025-08-07 星期四

  • 写游记

莫队是干什么用的 awa?

怎么就这么写出来了 awa?

为什么要分块 awa?

等会分块是什么 awa?

A Few Moments Later...

诶什么,二分?那不有手就行!

wc 这像是二分吗?

补兑,整体二分,整体二分是啥?

哦就是一起二分搜了。

那怎么搜呢 awa

wdnmd 我听不懂啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊!!!!!!!!!!!!!!!!!!!!!!!

我想干但没干成的事情

Day 5 2025-08-08 星期五

  • 写游记

平衡树听起来是十分舒服的✌

(大概原因是换了个学长讲课吧,hhh

今天还抢了个首解(【模版】可持久化平衡树

然后把它一起整合成了数据结构,想看我的 std 的自己看,不想看的略过谢谢。

这几天的数据结构(不建议展开)
C++
   1
   2
   3
   4
   5
   6
   7
   8
   9
  10
  11
  12
  13
  14
  15
  16
  17
  18
  19
  20
  21
  22
  23
  24
  25
  26
  27
  28
  29
  30
  31
  32
  33
  34
  35
  36
  37
  38
  39
  40
  41
  42
  43
  44
  45
  46
  47
  48
  49
  50
  51
  52
  53
  54
  55
  56
  57
  58
  59
  60
  61
  62
  63
  64
  65
  66
  67
  68
  69
  70
  71
  72
  73
  74
  75
  76
  77
  78
  79
  80
  81
  82
  83
  84
  85
  86
  87
  88
  89
  90
  91
  92
  93
  94
  95
  96
  97
  98
  99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
 132
 133
 134
 135
 136
 137
 138
 139
 140
 141
 142
 143
 144
 145
 146
 147
 148
 149
 150
 151
 152
 153
 154
 155
 156
 157
 158
 159
 160
 161
 162
 163
 164
 165
 166
 167
 168
 169
 170
 171
 172
 173
 174
 175
 176
 177
 178
 179
 180
 181
 182
 183
 184
 185
 186
 187
 188
 189
 190
 191
 192
 193
 194
 195
 196
 197
 198
 199
 200
 201
 202
 203
 204
 205
 206
 207
 208
 209
 210
 211
 212
 213
 214
 215
 216
 217
 218
 219
 220
 221
 222
 223
 224
 225
 226
 227
 228
 229
 230
 231
 232
 233
 234
 235
 236
 237
 238
 239
 240
 241
 242
 243
 244
 245
 246
 247
 248
 249
 250
 251
 252
 253
 254
 255
 256
 257
 258
 259
 260
 261
 262
 263
 264
 265
 266
 267
 268
 269
 270
 271
 272
 273
 274
 275
 276
 277
 278
 279
 280
 281
 282
 283
 284
 285
 286
 287
 288
 289
 290
 291
 292
 293
 294
 295
 296
 297
 298
 299
 300
 301
 302
 303
 304
 305
 306
 307
 308
 309
 310
 311
 312
 313
 314
 315
 316
 317
 318
 319
 320
 321
 322
 323
 324
 325
 326
 327
 328
 329
 330
 331
 332
 333
 334
 335
 336
 337
 338
 339
 340
 341
 342
 343
 344
 345
 346
 347
 348
 349
 350
 351
 352
 353
 354
 355
 356
 357
 358
 359
 360
 361
 362
 363
 364
 365
 366
 367
 368
 369
 370
 371
 372
 373
 374
 375
 376
 377
 378
 379
 380
 381
 382
 383
 384
 385
 386
 387
 388
 389
 390
 391
 392
 393
 394
 395
 396
 397
 398
 399
 400
 401
 402
 403
 404
 405
 406
 407
 408
 409
 410
 411
 412
 413
 414
 415
 416
 417
 418
 419
 420
 421
 422
 423
 424
 425
 426
 427
 428
 429
 430
 431
 432
 433
 434
 435
 436
 437
 438
 439
 440
 441
 442
 443
 444
 445
 446
 447
 448
 449
 450
 451
 452
 453
 454
 455
 456
 457
 458
 459
 460
 461
 462
 463
 464
 465
 466
 467
 468
 469
 470
 471
 472
 473
 474
 475
 476
 477
 478
 479
 480
 481
 482
 483
 484
 485
 486
 487
 488
 489
 490
 491
 492
 493
 494
 495
 496
 497
 498
 499
 500
 501
 502
 503
 504
 505
 506
 507
 508
 509
 510
 511
 512
 513
 514
 515
 516
 517
 518
 519
 520
 521
 522
 523
 524
 525
 526
 527
 528
 529
 530
 531
 532
 533
 534
 535
 536
 537
 538
 539
 540
 541
 542
 543
 544
 545
 546
 547
 548
 549
 550
 551
 552
 553
 554
 555
 556
 557
 558
 559
 560
 561
 562
 563
 564
 565
 566
 567
 568
 569
 570
 571
 572
 573
 574
 575
 576
 577
 578
 579
 580
 581
 582
 583
 584
 585
 586
 587
 588
 589
 590
 591
 592
 593
 594
 595
 596
 597
 598
 599
 600
 601
 602
 603
 604
 605
 606
 607
 608
 609
 610
 611
 612
 613
 614
 615
 616
 617
 618
 619
 620
 621
 622
 623
 624
 625
 626
 627
 628
 629
 630
 631
 632
 633
 634
 635
 636
 637
 638
 639
 640
 641
 642
 643
 644
 645
 646
 647
 648
 649
 650
 651
 652
 653
 654
 655
 656
 657
 658
 659
 660
 661
 662
 663
 664
 665
 666
 667
 668
 669
 670
 671
 672
 673
 674
 675
 676
 677
 678
 679
 680
 681
 682
 683
 684
 685
 686
 687
 688
 689
 690
 691
 692
 693
 694
 695
 696
 697
 698
 699
 700
 701
 702
 703
 704
 705
 706
 707
 708
 709
 710
 711
 712
 713
 714
 715
 716
 717
 718
 719
 720
 721
 722
 723
 724
 725
 726
 727
 728
 729
 730
 731
 732
 733
 734
 735
 736
 737
 738
 739
 740
 741
 742
 743
 744
 745
 746
 747
 748
 749
 750
 751
 752
 753
 754
 755
 756
 757
 758
 759
 760
 761
 762
 763
 764
 765
 766
 767
 768
 769
 770
 771
 772
 773
 774
 775
 776
 777
 778
 779
 780
 781
 782
 783
 784
 785
 786
 787
 788
 789
 790
 791
 792
 793
 794
 795
 796
 797
 798
 799
 800
 801
 802
 803
 804
 805
 806
 807
 808
 809
 810
 811
 812
 813
 814
 815
 816
 817
 818
 819
 820
 821
 822
 823
 824
 825
 826
 827
 828
 829
 830
 831
 832
 833
 834
 835
 836
 837
 838
 839
 840
 841
 842
 843
 844
 845
 846
 847
 848
 849
 850
 851
 852
 853
 854
 855
 856
 857
 858
 859
 860
 861
 862
 863
 864
 865
 866
 867
 868
 869
 870
 871
 872
 873
 874
 875
 876
 877
 878
 879
 880
 881
 882
 883
 884
 885
 886
 887
 888
 889
 890
 891
 892
 893
 894
 895
 896
 897
 898
 899
 900
 901
 902
 903
 904
 905
 906
 907
 908
 909
 910
 911
 912
 913
 914
 915
 916
 917
 918
 919
 920
 921
 922
 923
 924
 925
 926
 927
 928
 929
 930
 931
 932
 933
 934
 935
 936
 937
 938
 939
 940
 941
 942
 943
 944
 945
 946
 947
 948
 949
 950
 951
 952
 953
 954
 955
 956
 957
 958
 959
 960
 961
 962
 963
 964
 965
 966
 967
 968
 969
 970
 971
 972
 973
 974
 975
 976
 977
 978
 979
 980
 981
 982
 983
 984
 985
 986
 987
 988
 989
 990
 991
 992
 993
 994
 995
 996
 997
 998
 999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
/*
* @file std-datastruct.cpp
* @author Federico Prask
* @time 2025-08-08
* 本文件实现了多种常见的数据结构,包括线段树、Treap、FHQ-Treap等
*/

// 包含标准库头文件
#include <bits/stdc++.h>

// 定义文件输入输出宏,方便处理文件IO
// #s会将参数转换为字符串,用于生成文件名
#define file(s) \
    std::freopen(#s".in", "r", stdin), std::freopen(#s".out", "w", stdout)

// 定义类型别名
using i64 = long long;        // 64位有符号整数
using ull = unsigned long long; // 64位无符号整数
using f32 = double;           // 32位浮点数
using ldb = long double;      // 扩展精度浮点数

// 命名空间trix,包含快速输入函数
namespace trix{
    // 读取整数
    inline int readint() {
        register int x = 0, sign = 1;  // x存储结果,sign存储符号
        register char ch = getchar();  // 读取第一个字符
        // 跳过非数字字符
        for (; !isdigit(ch); ch = getchar()) {
            if (ch == '-') {    // 处理负号
                sign = -1;
            }
            if (ch == EOF) {     // 处理文件结束
                return EOF;
            }
        }
        // 处理数字部分
        for (; isdigit(ch); ch = getchar()) {
            x = x * 10 + ch - '0';  // 逐位构建整数
        }
        return x * sign;  // 返回带符号的结果
    }

    // 读取64位整数(实现与readint类似)
    inline i64 readi64() {
        register i64 x = 0, sign = 1;
        register char ch = getchar();
        for (; !isdigit(ch); ch = getchar()) {
            if (ch == '-') {    
                sign = -1;
            }
            if (ch == EOF) {
                return EOF;
            }
        }
        for (; isdigit(ch); ch = getchar()) {
            x = x * 10 + ch - '0';
        }
        return x * sign;
    }

    // 读取字符(跳过空格和换行)
    inline char readchar() {
        register char ch = getchar();
        for (; ch == ' ' || ch == '\n'; ch = getchar()) {
            continue;  // 跳过空白字符
        }
        return ch;  // 返回第一个非空白字符
    }
}

// 数据结构命名空间
namespace DataStruct {
    template<int MAXN, int MAXK>
    class MoAlgorithm {
        // 查询结构体
        struct Query {
            int l, r, id;  // 查询区间[l,r]和查询id

            // 排序比较函数(奇偶块优化)
            bool operator<(const Query &q) const {
                if (l / BLOCK_SIZE != q.l / BLOCK_SIZE)
                    return l < q.l;
                return (l / BLOCK_SIZE & 1) ? r < q.r : r > q.r;
            }
        };

        int n, m, k;               // 元素数量、查询数量、特定值k
        int BLOCK_SIZE;            // 分块大小
        i64 nowAns;                // 当前答案
        int a[MAXN], prefix[MAXN]; // 原数组和前缀异或数组
        i64 ans[MAXN];             // 存储每个查询的答案
        int cnt[MAXK];             // 计数数组
        Query querys[MAXN];        // 查询数组

    public:
        // 构造函数
        MoAlgorithm() : nowAns(0) {
            std::memset(cnt, 0, sizeof(cnt));
        }

        // 设置分块大小(可选)
        void setBlockSize(int size) {
            BLOCK_SIZE = size;
        }

        // 初始化数据
        void init(int _n, int _m, int _k) {
            n = _n;
            m = _m;
            k = _k;

            // 如果没有设置分块大小,使用默认计算
            if (BLOCK_SIZE == 0) {
                BLOCK_SIZE = std::max(1, (int)(n / sqrt(m)));
            }
        }

        // 添加元素到数组
        void addElement(int pos, int val) {
            a[pos] = val;
        }

        // 添加查询
        void addQuery(int id, int l, int r) {
            querys[id] = {l, r, id};
        }

        // 计算前缀异或数组
        void computePrefix() {
            prefix[0] = 0;
            for (int i = 1; i <= n; ++i) {
                prefix[i] = prefix[i - 1] ^ a[i];
            }
        }

        // 运行莫队算法
        void run() {
            std::sort(querys, querys + m);

            int l = 1, r = 0;
            nowAns = 0;
            cnt[0] = 1;  // 初始化前缀和0出现1次

            for (int i = 0; i < m; ++i) {
                const Query &q = querys[i];

                // 扩展左边界
                while (l > q.l) {
                    l--;
                    add(l - 1);  // 注意这里是l-1,因为计算的是前缀和
                }
                // 扩展右边界
                while (r < q.r) {
                    r++;
                    add(r);
                }
                // 收缩左边界
                while (l < q.l) {
                    remove(l - 1);
                    l++;
                }
                // 收缩右边界
                while (r > q.r) {
                    remove(r);
                    r--;
                }

                ans[q.id] = nowAns;
            }
        }

        // 获取查询结果
        i64 getAnswer(int id) const {
            return ans[id];
        }

        // 打印所有查询结果
        void printAnswers() const {
            for (int i = 0; i < m; ++i) {
                printf("%lld\n", ans[i]);
            }
        }

    private:
        // 添加位置到当前区间
        inline void add(int pos) {
            nowAns += cnt[prefix[pos] ^ k];
            cnt[prefix[pos]]++;
        }

        // 从当前区间移除位置
        inline void remove(int pos) {
            cnt[prefix[pos]]--;
            nowAns -= cnt[prefix[pos] ^ k];
        }
    };
    // 线段树模板类(区间加法)
    // _N是最大节点数
    template<int _N>
    class Segment_Tree_Segadd {
        // 线段树节点结构
        struct binary_tree {
            i64 left_son = 0, right_son = 0;  // 区间左右端点
            i64 value = 0, addition = 0;     // 区间值和懒惰标记
        } node[_N << 2];  // 4倍空间
        i64 *a;  // 指向外部数组的指针

        public:
            // 构建线段树
            void build_tree(i64 n, i64 *_a) {
                a = _a;  // 保存外部数组指针
                _build_tree(1, 1, n);  // 从根节点开始构建
            }

            // 区间更新
            void update(i64 l, i64 r, i64 val) {
                if (l > r) return;  // 无效区间直接返回
                _update(1, l, r, val);  // 从根节点开始更新
            }

            // 区间查询
            i64 query(i64 l, i64 r) {
                if (l > r) return 0;  // 无效区间返回0
                return _query(1, l, r);  // 从根节点开始查询
            }

        private:
            // 上推更新,合并子节点信息
            void pushup(i64 x) {
                node[x].value = node[x << 1].value + node[(x << 1) | 1].value;
            }

            // 下推懒惰标记
            void pushdown(i64 x) {
                if (node[x].addition) {  // 如果有懒惰标记
                    i64 left = x << 1;   // 左子节点
                    i64 right = (x << 1) | 1;  // 右子节点
                    i64 len_left = node[left].right_son - node[left].left_son + 1;  // 左区间长度
                    i64 len_right = node[right].right_son - node[right].left_son + 1;  // 右区间长度

                    // 更新子节点的懒惰标记和值
                    node[left].addition += node[x].addition;
                    node[right].addition += node[x].addition;
                    node[left].value += node[x].addition * len_left;
                    node[right].value += node[x].addition * len_right;
                    node[x].addition = 0;  // 清空当前节点的懒惰标记
                }
            }

            // 递归构建线段树
            void _build_tree(i64 x, i64 l, i64 r) {
                node[x].left_son = l;
                node[x].right_son = r;
                node[x].addition = 0;  // 初始化懒惰标记
                if (l == r) {  // 叶子节点
                    node[x].value = a[l];  // 直接赋值
                    return;
                }
                i64 mid = (l + r) >> 1;  // 计算中点
                _build_tree(x << 1, l, mid);      // 构建左子树
                _build_tree((x << 1) | 1, mid + 1, r);  // 构建右子树
                pushup(x);  // 合并子节点信息
            }

            // 递归更新区间
            void _update(i64 now, i64 l, i64 r, i64 k) {
                // 当前区间完全包含在更新区间内
                if (l <= node[now].left_son && r >= node[now].right_son) {
                    // 更新区间值和懒惰标记
                    node[now].value += k * (node[now].right_son - node[now].left_son + 1);
                    node[now].addition += k;
                    return;
                }

                pushdown(now);  // 下推懒惰标记
                i64 mid = (node[now].left_son + node[now].right_son) >> 1;
                if (l <= mid) _update(now << 1, l, r, k);      // 更新左子树
                if (r > mid) _update((now << 1) | 1, l, r, k);  // 更新右子树
                pushup(now);  // 合并子节点信息
            }

            // 递归查询区间
            i64 _query(i64 x, i64 l, i64 r) {
                // 当前区间完全包含在查询区间内
                if (l <= node[x].left_son && node[x].right_son <= r) {
                    return node[x].value;  // 直接返回值
                }
                pushdown(x);  // 下推懒惰标记
                i64 mid = (node[x].left_son + node[x].right_son) >> 1;
                i64 sum = 0;
                if (l <= mid) {
                    sum += _query(x << 1, l, r);  // 查询左子树
                }
                if (r > mid) {
                    sum += _query((x << 1) | 1, l, r);  // 查询右子树
                }
                return sum;
            }
        };

    // 线段树模板类(区间覆盖)
    // 实现与Segment_Tree_Segadd类似,主要区别在于覆盖操作
    template<int _N>
    class Segment_Tree_Segcover {
        struct binary_tree {
            i64 left_son = 0, right_son = 0;
            i64 value = 0, cover = 0;  // cover存储覆盖值
            bool has_cover = false;     // 标记是否被覆盖
        } node[_N << 2];
        i64 *a;

        public:
            void build_tree(i64 n, i64 *_a) {
                a = _a;
                _build_tree(1, 1, n);
            }
            void update(i64 l, i64 r, i64 val) {
                if (l > r) return;
                _update(1, l, r, val);
            }
            i64 query(i64 l, i64 r) {
                if (l > r) return 0;
                return _query(1, l, r);
            }

        private:
            void pushup(i64 x) {
                node[x].value = node[x << 1].value + node[(x << 1) | 1].value;
            }
            void pushdown(i64 x) {
                if (node[x].has_cover) {  // 如果有覆盖标记
                    i64 left = x << 1;
                    i64 right = (x << 1) | 1;
                    i64 len_left = node[left].right_son - node[left].left_son + 1;
                    i64 len_right = node[right].right_son - node[right].left_son + 1;

                    // 覆盖子节点
                    node[left].cover = node[x].cover;
                    node[right].cover = node[x].cover;
                    node[left].value = node[x].cover * len_left;
                    node[right].value = node[x].cover * len_right;
                    node[left].has_cover = true;
                    node[right].has_cover = true;

                    node[x].has_cover = false;  // 清除覆盖标记
                }
            }
            void _build_tree(i64 x, i64 l, i64 r) {
                node[x].left_son = l;
                node[x].right_son = r;
                node[x].has_cover = false;
                if (l == r) {
                    node[x].value = a[l];
                    return;
                }
                i64 mid = (l + r) >> 1;
                _build_tree(x << 1, l, mid);
                _build_tree((x << 1) | 1, mid + 1, r);
                pushup(x);
            }
            void _update(i64 now, i64 l, i64 r, i64 k) {
                if (l <= node[now].left_son && r >= node[now].right_son) {
                    // 覆盖操作
                    node[now].value = k * (node[now].right_son - node[now].left_son + 1);
                    node[now].cover = k;
                    node[now].has_cover = true;
                    return;
                }

                pushdown(now);
                i64 mid = (node[now].left_son + node[now].right_son) >> 1;
                if (l <= mid) _update(now << 1, l, r, k);
                if (r > mid) _update((now << 1) | 1, l, r, k);
                pushup(now);
            }
            i64 _query(i64 x, i64 l, i64 r) {
                if (l <= node[x].left_son && node[x].right_son <= r) {
                    return node[x].value;
                }
                pushdown(x);
                i64 mid = (node[x].left_son + node[x].right_son) >> 1;
                i64 sum = 0;
                if (l <= mid) {
                    sum += _query(x << 1, l, r);
                }
                if (r > mid) {
                    sum += _query((x << 1) | 1, l, r);
                }
                return sum;
            }
    };

    // Treap (树堆) - 一种平衡二叉搜索树
    class Treap {
        // 使用数组实现二叉树
        static const int MN = 2100005;  // 最大节点数
        int l[MN], r[MN];      // 左右子节点索引
        int value[MN];         // 节点值
        int rand_val[MN];      // 随机优先级
        int sz[MN];           // 子树大小
        int w[MN];            // 相同值的计数
        int nans, size;       // 临时答案和当前大小
        int root;            // 根节点索引

        public:
            Treap() : root(0), size(0), nans(0) {
                std::memset(l, 0, sizeof(l));
                std::memset(r, 0, sizeof(r));
                std::srand(std::time(0));  // 初始化随机数种子
            }

            // 查询值的排名
            int qrnk(int x) {
                return queryrank(root, x);
            }

            // 查询排名对应的值
            int qnum(int x) {
                return querynum(root, x);
            }

            // 查询前驱
            int qpre(int x) {
                nans = 0;  // 重置临时答案
                querypre(root, x);
                return nans ? value[nans] : -2147483647;  // 返回前驱值或最小值
            }

            // 查询后继
            int qsub(int x) {
                nans = 0;
                querysub(root, x);
                return nans ? value[nans] : 2147483647;  // 返回后继值或最大值
            }

            // 删除值
            void del(int x) {
                _delete(root, x);
            }

            // 插入值
            void ins(int x) {
                _insert(root, x);
            }

        private:
            // 更新子树大小
            void pushup(int x) {
                sz[x] = sz[l[x]] + sz[r[x]] + w[x];
            }

            // 左旋
            void left_rotate(int &k) {
                int t = r[k];
                r[k] = l[t];
                l[t] = k;
                sz[t] = sz[k];  // 更新大小
                pushup(k);      // 重新计算k的大小
                k = t;          // k指向新的根
            }

            // 右旋
            void right_rotate(int &k) {
                int t = l[k];
                l[k] = r[t];
                r[t] = k;
                sz[t] = sz[k];
                pushup(k);
                k = t;
            }

            // 递归插入
            void _insert(int &k, int x) {
                if (!k) {  // 空节点,创建新节点
                    size++;
                    k = size;
                    sz[k] = 1;
                    w[k] = 1;
                    value[k] = x;
                    rand_val[k] = rand();  // 设置随机优先级
                    return;
                }
                sz[k]++;  // 增加当前节点大小
                if (value[k] == x) {  // 值已存在,增加计数
                    w[k]++;
                } else if (value[k] < x) {  // 插入右子树
                    _insert(r[k], x);
                    if (rand_val[r[k]] < rand_val[k]) {  // 维护堆性质
                        left_rotate(k);
                    }
                } else {  // 插入左子树
                    _insert(l[k], x);
                    if (rand_val[l[k]] < rand_val[k]) {  // 维护堆性质
                        right_rotate(k);
                    }
                }
            }

            // 递归删除
            bool _delete(int &k, int x) {
                if (!k) {  // 值不存在
                    return false;
                }
                if (value[k] == x) {  // 找到要删除的值
                    if (w[k] > 1) {   // 有多个相同值,只需减少计数
                        w[k]--;
                        sz[k]--;
                        return true;
                    }
                    if (l[k] == 0 || r[k] == 0) {  // 只有一个子节点或没有子节点
                        k = l[k] + r[k];  // 用子节点替代
                        return true;
                    } else if (rand_val[l[k]] < rand_val[r[k]]) {  // 根据优先级旋转
                        right_rotate(k);
                        return _delete(k, x);
                    } else {
                        left_rotate(k);
                        return _delete(k, x);
                    }
                } else if (value[k] < x) {  // 在右子树中删除
                    bool succ = _delete(r[k], x);
                    if (succ) {
                        sz[k]--;  // 更新大小
                    }
                    return succ;
                } else {  // 在左子树中删除
                    bool succ = _delete(l[k], x);
                    if (succ) {
                        sz[k]--;
                    }
                    return succ;
                }
            }

            // 查询值的排名
            int queryrank(int k, int x) {
                if (!k) {
                    return 1;  // 空树返回1
                }
                if (value[k] == x) {  // 找到值
                    return sz[l[k]] + 1;  // 左子树大小+1
                } else if (x > value[k]) {  // 在右子树中查询
                    return sz[l[k]] + w[k] + queryrank(r[k], x);
                } else {  // 在左子树中查询
                    return queryrank(l[k], x);
                }
            }

            // 查询排名对应的值
            int querynum(int k, int x) {
                if (!k) {
                    return 0;
                }
                if (x <= sz[l[k]]) {  // 在左子树中
                    return querynum(l[k], x);
                }
                else if (x > sz[l[k]] + w[k]) {  // 在右子树中
                    return querynum(r[k], x - sz[l[k]] - w[k]);
                }
                else {  // 当前节点
                    return value[k];
                }
            }

            // 查询前驱
            void querypre(int k, int x) {
                if (!k) {
                    return;
                }
                if (value[k] < x) {  // 当前节点可能是前驱
                    nans = k;       // 保存候选节点
                    querypre(r[k], x);  // 继续在右子树中寻找更大的前驱
                }
                else {
                    querypre(l[k], x);  // 在左子树中寻找
                }
            }

            // 查询后继
            void querysub(int k, int x) {
                if (!k) {
                    return;
                }
                if (value[k] > x) {  // 当前节点可能是后继
                    nans = k;        // 保存候选节点
                    querysub(l[k], x);  // 继续在左子树中寻找更小的后继
                }
                else {
                    querysub(r[k], x);  // 在右子树中寻找
                }
            }
    };

    // FHQ-Treap (非旋转Treap)
    class FHQTreap {
        static const int MN = 2100005;  // 最大节点数
        int l[MN], r[MN];      // 左右子节点
        int value[MN];         // 节点值
        int rand_val[MN];      // 随机优先级
        int sz[MN];           // 子树大小
        int cnt, root;        // 节点计数和根节点

        public:
            FHQTreap() : root(0), cnt(0) {
                std::memset(l, 0, sizeof(l));
                std::memset(r, 0, sizeof(r));
                std::srand(std::time(0));  // 初始化随机数种子
            }

            // 插入值
            void ins(int x) {
                int a, b;
                split(root, x, a, b);  // 按x分割
                root = merge(merge(a, new_node(x)), b);  // 合并
            }

            // 删除值
            void del(int x) {
                int a, b, c;
                split(root, x, a, b);       // 按x分割
                split(b, x + 1, b, c);      // 按x+1分割,分离出x
                if (b) {
                    b = merge(l[b], r[b]);   // 合并b的左右子树(相当于删除b)
                }
                root = merge(merge(a, b), c);  // 重新合并
            }

            // 查询排名
            int qrnk(int x) {
                int a, b;
                split(root, x - 1, a, b);   // 按x-1分割
                int res = sz[a] + 1;        // a的大小+1就是x的排名
                root = merge(a, b);         // 恢复树
                return res;
            }

            // 查询排名对应的值
            int qnum(int k) {
                return kth(root, k);  // 查找第k小
            }

            // 查询前驱
            int qpre(int x) {
                int a, b;
                split(root, x - 1, a, b);   // 按x-1分割
                int res = kth(a, sz[a]);   // a中最大的就是前驱
                root = merge(a, b);
                return res;
            }

            // 查询后继
            int qsub(int x) {
                int a, b;
                split(root, x, a, b);      // 按x分割
                int res = kth(b, 1);        // b中最小的就是后继
                root = merge(a, b);
                return res;
            }

        private:
            // 创建新节点
            int new_node(int x) {
                cnt++;
                value[cnt] = x;
                rand_val[cnt] = rand();  // 随机优先级
                sz[cnt] = 1;            // 初始大小
                return cnt;
            }

            // 更新子树大小
            void pushup(int x) {
                sz[x] = sz[l[x]] + sz[r[x]] + 1;
            }

            // 按值分割树
            void split(int now, int k, int &x, int &y) {
                if (!now) {  // 空树
                    x = y = 0;
                    return;
                }
                if (value[now] <= k) {  // 当前节点值<=k,归入x树
                    x = now;
                    split(r[now], k, r[now], y);  // 继续分割右子树
                } else {  // 当前节点值>k,归入y树
                    y = now;
                    split(l[now], k, x, l[now]);  // 继续分割左子树
                }
                pushup(now);  // 更新大小
            }

            // 合并两棵树
            int merge(int x, int y) {
                if (!x || !y) {  // 任意一棵树为空,返回另一棵
                    return x | y;
                }
                // 按优先级合并
                if (rand_val[x] < rand_val[y]) {  // x的优先级更高
                    r[x] = merge(r[x], y);       // y合并到x的右子树
                    pushup(x);
                    return x;
                } else {  // y的优先级更高
                    l[y] = merge(x, l[y]);       // x合并到y的左子树
                    pushup(y);
                    return y;
                }
            }

            // 查找第k小的值
            int kth(int now, int k) {
                while (true) {
                    if (k <= sz[l[now]]) {  // 在左子树中
                        now = l[now];
                    } else if (k == sz[l[now]] + 1) {  // 当前节点
                        return value[now];
                    } else {  // 在右子树中
                        k -= sz[l[now]] + 1;
                        now = r[now];
                    }
                }
            }
    };

    // 可持久化FHQ-Treap
    class PersistentFHQTreap {
        static const int MN = 5e5 + 10;  // 最大节点数
        static const int INF = 2147483647;  // 无穷大

        // 节点结构
        struct Node {
            int l, r;      // 左右子节点
            int val, key;  // 值和随机优先级
            int size;      // 子树大小
        } t[MN * 50];     // 可持久化需要更多空间

        public:
            int root[MN], cnt;  // 多个版本的根和节点计数
            PersistentFHQTreap() : cnt(0) {
                std::fill(root, root + MN, 0);
                std::srand(std::time(0));  // 初始化随机数种子
            }

            // 插入值(创建新版本)
            void insert(int ver, int new_ver, int val) {
                root[new_ver] = root[ver];  // 基于旧版本
                int x, y;
                split(root[new_ver], val, x, y);  // 分割
                root[new_ver] = merge(merge(x, new_node(val)), y);  // 合并
            }

            // 删除值(创建新版本)
            void remove(int ver, int new_ver, int val) {
                root[new_ver] = root[ver];  // 基于旧版本
                int x, y, z;
                split(root[new_ver], val, x, z);      // 按val分割
                split(x, val - 1, x, y);               // 按val-1分割
                if (y) y = merge(t[y].l, t[y].r);      // 合并y的左右子树(相当于删除y)
                root[new_ver] = merge(merge(x, y), z);  // 重新合并
            }

            // 查询排名
            int get_rank(int ver, int val) {
                int x, y;
                split(root[ver], val - 1, x, y);  // 按val-1分割
                int res = t[x].size + 1;         // x的大小+1就是排名
                root[ver] = merge(x, y);         // 恢复
                return res;
            }

            // 查询排名对应的值
            int get_val(int ver, int rank) {
                return _get_val(root[ver], rank);
            }

            // 查询前驱
            int get_prev(int ver, int val) {
                int x, y;
                split(root[ver], val - 1, x, y);  // 按val-1分割
                if (!x) return -INF + 1;         // 没有前驱
                int res = _get_val(x, t[x].size); // x中最大的就是前驱
                root[ver] = merge(x, y);
                return res;
            }

            // 查询后继
            int get_next(int ver, int val) {
                int x, y;
                split(root[ver], val, x, y);  // 按val分割
                if (!y) return INF;           // 没有后继
                int res = _get_val(y, 1);     // y中最小的就是后继
                root[ver] = merge(x, y);
                return res;
            }

        private:
            // 创建新节点
            int new_node(int val) {
                t[++cnt] = {0, 0, val, rand(), 1};  // 初始化新节点
                return cnt;
            }

            // 克隆节点(用于可持久化)
            int clone(int p) {
                if (!p) return 0;
                t[++cnt] = t[p];  // 复制节点
                return cnt;
            }

            // 更新子树大小
            void pushup(int p) {
                t[p].size = t[t[p].l].size + t[t[p].r].size + 1;
            }

            // 按值分割树(可持久化版本)
            void split(int p, int val, int &x, int &y) {
                if (!p) {
                    x = y = 0;
                    return;
                }
                p = clone(p);  // 克隆节点
                if (t[p].val <= val) {  // 当前节点值<=val,归入x树
                    x = p;
                    split(t[x].r, val, t[x].r, y);  // 继续分割右子树
                } else {  // 当前节点值>val,归入y树
                    y = p;
                    split(t[y].l, val, x, t[y].l);  // 继续分割左子树
                }
                pushup(p);  // 更新大小
            }

            // 合并两棵树(可持久化版本)
            int merge(int x, int y) {
                if (!x || !y) return x | y;
                if (t[x].key < t[y].key) {  // x优先级更高
                    x = clone(x);           // 克隆x
                    t[x].r = merge(t[x].r, y);  // y合并到x的右子树
                    pushup(x);
                    return x;
                } else {  // y优先级更高
                    y = clone(y);           // 克隆y
                    t[y].l = merge(x, t[y].l);  // x合并到y的左子树
                    pushup(y);
                    return y;
                }
            }

            // 查找第k小的值
            int _get_val(int p, int rank) {
                while (true) {
                    if (rank <= t[t[p].l].size) {  // 在左子树中
                        p = t[p].l;
                    } else if (rank == t[t[p].l].size + 1) {  // 当前节点
                        return t[p].val;
                    } else {  // 在右子树中
                        rank -= t[t[p].l].size + 1;
                        p = t[p].r;
                    }
                }
            }
    };

    // 可持久化文艺平衡树
    class PersistentWenYiTreap {
        static const int MN = 5e5 + 10;  // 最大节点数
        static const int INF = 2147483647;  // 无穷大

        // 节点结构
        struct Node {
            int l, r;        // 左右子节点
            int val, key;    // 值和随机优先级
            int size;        // 子树大小
            long long sum;   // 子树和(文艺平衡树新增)
            bool rev;        // 翻转标记(文艺平衡树新增)
        } t[MN * 50];       // 可持久化需要更多空间

        public:
            int root[MN], cnt;  // 多个版本的根和节点计数
            PersistentWenYiTreap() : cnt(0) {
                std::fill(root, root + MN, 0);
                std::srand(std::time(0));  // 初始化随机数种子
            }

            // 在位置pos后插入值val(创建新版本)
            void insert(int ver, int new_ver, int pos, int val) {
                root[new_ver] = root[ver];  // 基于旧版本
                int x, y;
                split_by_rank(root[new_ver], pos, x, y);  // 按位置分割
                root[new_ver] = merge(merge(x, new_node(val)), y);  // 合并
            }

            // 删除位置pos的值(创建新版本)
            void remove(int ver, int new_ver, int pos) {
                root[new_ver] = root[ver];  // 基于旧版本
                int x, y, z;
                split_by_rank(root[new_ver], pos, x, z);      // 按pos分割
                split_by_rank(x, pos - 1, x, y);               // 按pos-1分割
                root[new_ver] = merge(x, z);                   // 跳过y(相当于删除)
            }

            // 区间翻转(创建新版本)
            void reverse(int ver, int new_ver, int l, int r) {
                root[new_ver] = root[ver];  // 基于旧版本
                int x, y, z;
                split_by_rank(root[new_ver], r, y, z);     // 先分割出前r个
                split_by_rank(y, l - 1, x, y);             // 再分割出l到r
                t[y].rev ^= 1;                            // 打上翻转标记
                root[new_ver] = merge(merge(x, y), z);     // 重新合并
            }

            // 查询区间和
            long long query_sum(int ver, int l, int r) {
                int x, y, z;
                split_by_rank(root[ver], r, y, z);        // 先分割出前r个
                split_by_rank(y, l - 1, x, y);             // 再分割出l到r
                long long res = t[y].sum;                  // 获取区间和
                root[ver] = merge(merge(x, y), z);         // 恢复
                return res;
            }

            // 获取位置pos的值
            int get_val(int ver, int pos) {
                return _get_val(root[ver], pos);
            }

        private:
            // 创建新节点
            int new_node(int val) {
                t[++cnt] = {0, 0, val, rand(), 1, val, false};  // 初始化新节点
                return cnt;
            }

            // 克隆节点(用于可持久化)
            int clone(int p) {
                if (!p) return 0;
                t[++cnt] = t[p];  // 复制节点
                return cnt;
            }

            // 下传翻转标记
            void pushdown(int p) {
                if (!p || !t[p].rev) return;

                p = clone(p);  // 可持久化需要先克隆

                std::swap(t[p].l, t[p].r);  // 交换左右子树
                t[p].rev = false;           // 清除标记

                if (t[p].l) {
                    t[p].l = clone(t[p].l);  // 克隆左子树
                    t[t[p].l].rev ^= 1;     // 传递标记
                }
                if (t[p].r) {
                    t[p].r = clone(t[p].r);  // 克隆右子树
                    t[t[p].r].rev ^= 1;      // 传递标记
                }
            }

            // 更新子树大小和和
            void pushup(int p) {
                t[p].size = t[t[p].l].size + t[t[p].r].size + 1;
                t[p].sum = t[t[p].l].sum + t[t[p].r].sum + t[p].val;
            }

            // 按排名分割树(文艺平衡树需要按排名分割)
            void split_by_rank(int p, int rank, int &x, int &y) {
                if (!p) {
                    x = y = 0;
                    return;
                }
                pushdown(p);  // 下传翻转标记
                p = clone(p);  // 克隆节点

                if (t[t[p].l].size + 1 <= rank) {  // 当前节点在x树中
                    x = p;
                    split_by_rank(t[x].r, rank - t[t[p].l].size - 1, t[x].r, y);
                } else {  // 当前节点在y树中
                    y = p;
                    split_by_rank(t[y].l, rank, x, t[y].l);
                }
                pushup(p);  // 更新大小和和
            }

            // 合并两棵树
            int merge(int x, int y) {
                if (!x || !y) return x | y;

                pushdown(x);  // 下传标记
                pushdown(y);  // 下传标记

                if (t[x].key < t[y].key) {  // x优先级更高
                    x = clone(x);           // 克隆x
                    t[x].r = merge(t[x].r, y);  // y合并到x的右子树
                    pushup(x);
                    return x;
                } else {  // y优先级更高
                    y = clone(y);           // 克隆y
                    t[y].l = merge(x, t[y].l);  // x合并到y的左子树
                    pushup(y);
                    return y;
                }
            }

            // 查找第k小的值
            int _get_val(int p, int rank) {
                while (true) {
                    pushdown(p);  // 下传标记
                    if (rank <= t[t[p].l].size) {  // 在左子树中
                        p = t[p].l;
                    } else if (rank == t[t[p].l].size + 1) {  // 当前节点
                        return t[p].val;
                    } else {  // 在右子树中
                        rank -= t[t[p].l].size + 1;
                        p = t[p].r;
                    }
                }
            }
    };
}// namespace datastruct

using trix::readint;  // 使用trix命名空间中的readint

constexpr int MAXM = 1e6;
constexpr int MAXN = 1e6;
constexpr int MAXK = 1e6;

namespace examples{
    /*
    * 莫队使用示例:计算前缀亦或值,计算区间值并 O(1) 扩展
    */

    void work_mo_queue(){
        int n = readint();
        int m = readint();
        int k = readint();

        // 创建莫队实例
        DataStruct::MoAlgorithm<MAXN, MAXK> mo;
        mo.init(n, m, k);
        // 读取数组元素
        for (int i = 1; i <= n; ++i) {
            int val = readint();
            mo.addElement(i, val);
        }

        // 计算前缀异或
        mo.computePrefix();

        // 添加查询
        for (int i = 0; i < m; ++i) {
            int l = readint();
            int r = readint();
            mo.addQuery(i, l, r);
        }

        // 运行莫队算法
        mo.run();

        // 输出结果
        mo.printAnswers();
    }

    /*
    * 线段树使用示例:区间加法和区间查询
    * 1. 初始化线段树并构建
    * 2. 执行区间加法操作
    * 3. 执行区间查询操作
    */
    void work_segment_tree_add() {
        const int N = 1e5 + 10;
        static i64 a[N];

        int n = readint();  // 数组大小
        int m = readint();  // 操作次数

        // 读取初始数组
        for (int i = 1; i <= n; ++i) {
            a[i] = readint();
        }

        // 初始化线段树
        DataStruct::Segment_Tree_Segadd<N> seg;
        seg.build_tree(n, a);

        while (m--) {
            int op = readint();
            if (op == 1) {
                // 区间加法操作:将区间[l,r]每个元素加k
                int l = readint();
                int r = readint();
                int k = readint();
                seg.update(l, r, k);
            } else {
                // 区间查询操作:查询区间[l,r]的和
                int l = readint();
                int r = readint();
                i64 res = seg.query(l, r);
                printf("%lld\n", res);
            }
        }
    }

    /*
    * 线段树使用示例:区间覆盖和区间查询
    * 1. 初始化线段树并构建
    * 2. 执行区间覆盖操作
    * 3. 执行区间查询操作
    */
    void work_segment_tree_cover() {
        const int N = 1e5 + 10;
        static i64 a[N];

        int n = readint();  // 数组大小
        int m = readint();  // 操作次数

        // 读取初始数组
        for (int i = 1; i <= n; ++i) {
            a[i] = readint();
        }

        // 初始化线段树
        DataStruct::Segment_Tree_Segcover<N> seg;
        seg.build_tree(n, a);

        while (m--) {
            int op = readint();
            if (op == 1) {
                // 区间覆盖操作:将区间[l,r]每个元素设置为k
                int l = readint();
                int r = readint();
                int k = readint();
                seg.update(l, r, k);
            } else {
                // 区间查询操作:查询区间[l,r]的和
                int l = readint();
                int r = readint();
                i64 res = seg.query(l, r);
                printf("%lld\n", res);
            }
        }
    }

    /*
    * Treap使用示例:平衡树基本操作
    * 1. 插入元素
    * 2. 删除元素
    * 3. 查询排名
    * 4. 查询第k小元素
    * 5. 查询前驱
    * 6. 查询后继
    */
    void work_treap() {
        DataStruct::Treap treap;
        int n = readint();

        while (n--) {
            int op = readint();
            int x = readint();

            switch (op) {
                case 1:  // 插入x
                    treap.ins(x);
                    break;
                case 2:  // 删除x
                    treap.del(x);
                    break;
                case 3:  // 查询x的排名(比x小的数的个数+1)
                    printf("%d\n", treap.qrnk(x));
                    break;
                case 4:  // 查询排名为x的数
                    printf("%d\n", treap.qnum(x));
                    break;
                case 5:  // 查询x的前驱(小于x的最大数)
                    printf("%d\n", treap.qpre(x));
                    break;
                case 6:  // 查询x的后继(大于x的最小数)
                    printf("%d\n", treap.qsub(x));
                    break;
            }
        }
    }

    /*
    * FHQ-Treap使用示例:平衡树基本操作(非旋转实现)
    * 1. 插入元素
    * 2. 删除元素
    * 3. 查询排名
    * 4. 查询第k小元素
    * 5. 查询前驱
    * 6. 查询后继
    */
    void work_fhq_treap() {
        DataStruct::FHQTreap treap;
        int n = readint();

        while (n--) {
            int op = readint();
            int x = readint();

            switch (op) {
                case 1:  // 插入x
                    treap.ins(x);
                    break;
                case 2:  // 删除x
                    treap.del(x);
                    break;
                case 3:  // 查询x的排名(比x小的数的个数+1)
                    printf("%d\n", treap.qrnk(x));
                    break;
                case 4:  // 查询排名为x的数
                    printf("%d\n", treap.qnum(x));
                    break;
                case 5:  // 查询x的前驱(小于x的最大数)
                    printf("%d\n", treap.qpre(x));
                    break;
                case 6:  // 查询x的后继(大于x的最小数)
                    printf("%d\n", treap.qsub(x));
                    break;
            }
        }
    }

    /*
    * 可持久化FHQ-Treap使用示例:支持历史版本操作的平衡树
    * 1. 在指定版本插入元素
    * 2. 在指定版本删除元素
    * 3. 查询指定版本的排名
    * 4. 查询指定版本的第k小元素
    * 5. 查询指定版本的前驱
    * 6. 查询指定版本的后继
    */
    void work_persistent_fhq_treap() {
        DataStruct::PersistentFHQTreap treap;
        int n = readint();
        int current_ver = 0;  // 当前版本号

        while (n--) {
            int ver = readint();  // 基础版本
            int op = readint();
            int x = readint();
            current_ver++;  // 新版本号

            switch (op) {
                case 1:  // 在版本ver插入x,创建新版本current_ver
                    treap.insert(ver, current_ver, x);
                    break;
                case 2:  // 在版本ver删除x,创建新版本current_ver
                    treap.remove(ver, current_ver, x);
                    break;
                case 3:  // 查询版本ver中x的排名
                    printf("%d\n", treap.get_rank(ver, x));
                    break;
                case 4:  // 查询版本ver中排名为x的数
                    printf("%d\n", treap.get_val(ver, x));
                    break;
                case 5:  // 查询版本ver中x的前驱
                    printf("%d\n", treap.get_prev(ver, x));
                    break;
                case 6:  // 查询版本ver中x的后继
                    printf("%d\n", treap.get_next(ver, x));
                    break;
            }
        }
    }
}

int main() {
    #ifdef FILEIO
    file(std-datastruct);
    #endif

    #ifdef CPPIO
    std::cin.tie(0) -> sync_with_stdio(0);
    #endif

    /* 在这里编写你的代码 */

    return 0;
}

哎不是,明天怎么还有测试啊,那我不炸了吗。

别看

今天晚上跑步是跑了我们学校第一,但是吧,跑前多喝了点水,就在胃里摇啊摇啊摇,导致跑完之后有点难受
呕呕呕呕呕yueyueyueyueyue

而且我们今天打跆拳道还不在馆内打,在室外。今天大太阳照了一天,晚上外面运动要热死了

对了,别问今天游记为什么这么短,因为我封装的数据结构太长了,也花费太多时间了,就没时间写了。

Day 6 2025-08-09 星期六

  • 写游记
注意到

今天不考试了,延期了,今天做题,昨天的题抢到了 rank #2

晚上出去吃的,吃的什么瘦肉牛丸粿条,还不错,就是有点贵。

晚上买了杯瑞幸(不是广子也不是咖啡,点的奶茶),感觉还行,但是我很 unhappy 的一点就是我没有看到茶百道,不然我去点茶百道了。

今天过得一般般。

Day 7 2025-08-10 星期日

  • 写游记

今天去了一趟后面忘了。

看了一眼参观指南想起来了

今天去了一趟 \(\Huge{广东科学中心}\)

发现文创店里好多瑕疵品,所以没买。

他的一些节气海报还挺好看的,具体详见我的微信朋友圈。

Day 8 2025-08-11 星期一

  • 写游记

忘记写了,忘了。

Day 9 2025-08-12 星期二

  • 写游记

忘记写了,基本忘了。

千万
千万
要记住
打球
之前
要看
拍子的
质量
不然
可能会
遇到
挥拍
之后
拍子
飞了
十几米
然后
撞到
墙壁
掉下了

(虽然是 zqh 干的但我还是热心的提醒一下大家)

很好的嵌套使我的大脑旋转。

Day 10 2025-08-13 星期三

  • 写游记

上午

睡觉,使得我的鼠标垫湿了(我出一身汗)

我不李姐

总是有一些时候睡觉出特别多的汗,但是晚上从来不出。

下午

很好的洛谷月赛,证明 T1 的正解的正确性使我的大脑翻转(本来准备今晚写的)。

晚上

听歌写游记。

体育课打乒乓发现地形崎岖,一看就是丘陵地形

Day 11 2025-08-14 星期四

  • 写游记

Day 12 2025-08-15 星期五

  • 写游记
  • 开发网站

网站做的不错

但是我是唐比,做网站的时候把我以前的项目删掉了(输入的命令清空了文件夹才配置的架构)

需要找个时间修一下。

链接

晚自习稍微加了个新功能,也就是网站的“关于”部分。

之后会慢慢加功能的。

Day 13 2025-08-16 星期六

  • 写游记

上午测了个试,运气好拿了个 rank #1

总结(别看,反正就是我是人机)

重要的事情说三遍

省流:我是人机,我太菜了,我是蒟蒻

省流:我是人机,我太菜了,我是蒟蒻

省流:我是人机,我太菜了,我是蒟蒻

虽然,

但是你仔细看看,

\(\because\)

\(\therefore\)

我今天下午上机,电脑炸了 5 次,有三次我强制重启了,剩下的两次我狂按 \(\text{Alt + F4}\) 把窗口关掉了。

tips: 我猜这电脑有内存泄漏,而且虚拟内存剧小,使得我总是容易内存爆栈。

T1 没过,签到题没过说明我太菜了,没有写出正解,看来我的刷题量还是太少了

T2 正常解出来,显然切 T2 的人还是特别多的。

T3 太惊险了,自己看提交时间吧。

显然,我还是太菜了,dp 学的不行,就是个废物。

而且代码还有人认为是人机(AI)。

不过确实,当时注意到容易炸(最开始写的用了四维数组,算了下内存占用,要 4 个 GB,所以后来用了 vector,使得我的代码非常抽象)

(以后会改的)

C++
1
2
3
std::vector<std::vector<std::vector<int>>> dp(
        a + 1, std::vector<std::vector<int>>(
            b + 1, std::vector<int>(c + 1, INF)));

(我也觉得挺狗屎,不过顺便给大家看我一位学长的逆天操作就会觉得这世间是有人上人的)

(还是 Vim 大佬)

(事后他发现 vector 让他 TLE 了)

做 T5 时很庆幸前一天晚上找我的学长复习了以下可持久化数据结构,所以今天~打~使用我之前的主席树板子还是挺顺畅的。

T6 的淀粉质我不会,啊所以还是我太菜了,加上超长码量我肯定是想不出来的,(赛时也肯定写不出来)。

不过写 T6 的时候时间不多了,所以我光速打了个暴搜跑路了(很好的拿下了 Subtask 1)

显然我运气还是很好的,混了个 505 的 rank #1,没想到这么蒟蒻也配拿 rank #1

咦原来橙漫山茶花就是直接把不去皮的橙子放进去吗

晚上和学长出去吃了个饭,还偷偷很同学打电话聊了会天

哦对了,还打了会 Phi。

Day 14 2025-08-17 星期日

  • 写游记

显然,我们四个拥有具有游戏属性的设备的人中,有三个都是玩三角洲的。

所以他们三个从早上吃完饭就开始赖着打三角洲。

上午的计划是去中山大学。

逛完博物馆吧,待在他的文创店,看到插头又是直接开玩,直接给干到了闭馆时间,工作人员要求我们 离开。

下午待在寝室,同学发了道高中数学题过来,被我秒了。

(但是晚上听讲座没事干还是去写了一份详细证明)

哦晚上联合去打白复生 IN Lv.16 了,我们几个真厉害(一前面一结尾一旁观),打出了 10 G 的好成绩(原来没有 FC)。

Day 15 2025-08-18 星期一

  • 写游记
  • 修复文档站

咦 @ImposterAnYu 晚上 0 点还在看洛谷啊?还有犇犇发,羡慕了。

今天为 网站 增加了一点新功能,具体就是能够支持 Markdown 嵌入和 KaTeX 支持。

失败

今天调试网站代码,由于 KaTeX 对于格式要求不一般的高,使得我调了半个小时才调好。

不过有了 Markdown 就方便了,今天把大家的个人主页做成了 Markdown 嵌入的,目前是直接抓取的洛谷上的源码。

哦对了,黄川铭 安雨姐姐 还告诉了我 benben.sbs 的奇妙网址。