1+ /* *
2+ * @file 1179-1003.cpp
3+ * @author Macesuted (i@macesuted.moe)
4+ * @date 2025-08-11
5+ *
6+ * @copyright Copyright (c) 2025
7+ *
8+ */
9+
10+ #include < bits/stdc++.h>
11+ using namespace std ;
12+
13+ #define endl ' \n '
14+
15+ using tiii = tuple<int , int , int >;
16+ using tiiii = tuple<int , int , int , int >;
17+
18+ class SegmentTree {
19+ private:
20+ struct Seg {
21+ int vl, l, r, vr;
22+
23+ Seg (void ) { vl = vr = 0 , l = 0 , r = 1e6 + 1 ; }
24+ };
25+
26+ vector<array<Seg, 2 >> a;
27+ vector<int > cnt;
28+ const int n = 1e6 ;
29+
30+ void merge (int &rl, int &rr, int ll, int lr) const {
31+ if (ll > rr) return rl = rr, void ();
32+ if (lr < rl) return rr = rl, void ();
33+ return rl = max (ll, rl), rr = min (lr, rr), void ();
34+ }
35+
36+ Seg merge (const array<Seg, 2 > &lp, const Seg &rp) const {
37+ Seg ans = rp;
38+
39+ int t = 0 ;
40+ if (ans.vl ) {
41+ t = 1 ;
42+ int l = lp[1 ].vr , r = ans.vl ;
43+ if (l > r) swap (l, r);
44+ merge (ans.l , ans.r , l, r);
45+ }
46+
47+ merge (ans.l , ans.r , lp[t].l , lp[t].r );
48+ ans.vl = lp[t].vl ;
49+
50+ return ans;
51+ }
52+
53+ void pushUp (int p) {
54+ cnt[p] = cnt[p << 1 ] + cnt[p << 1 | 1 ];
55+ if (!cnt[p << 1 ]) return a[p] = a[p << 1 | 1 ], void ();
56+ if (!cnt[p << 1 | 1 ]) return a[p] = a[p << 1 ], void ();
57+
58+ a[p][0 ] = merge (a[p << 1 ], a[p << 1 | 1 ][0 ]);
59+ a[p][1 ] = merge (a[p << 1 ], a[p << 1 | 1 ][1 ]);
60+
61+ return ;
62+ }
63+
64+ void build (int p, int l, int r) {
65+ if (l == r) return a[p][0 ] = a[p][1 ] = Seg (), cnt[p] = 0 , void ();
66+ int mid = (l + r) >> 1 ;
67+ build (p << 1 , l, mid), build (p << 1 | 1 , mid + 1 , r);
68+ return pushUp (p);
69+ }
70+
71+ void insert (int p, int l, int r, int qp, int v) {
72+ if (l == r) return a[p][0 ].vl = v, a[p][1 ].vr = v, cnt[p] = 1 , void ();
73+ int mid = (l + r) >> 1 ;
74+ qp <= mid ? insert (p << 1 , l, mid, qp, v) : insert (p << 1 | 1 , mid + 1 , r, qp, v);
75+ return pushUp (p);
76+ }
77+ void erase (int p, int l, int r, int qp) {
78+ if (l == r) return a[p][0 ] = a[p][1 ] = Seg (), cnt[p] = 0 , void ();
79+ int mid = (l + r) >> 1 ;
80+ qp <= mid ? erase (p << 1 , l, mid, qp) : erase (p << 1 | 1 , mid + 1 , r, qp);
81+ return pushUp (p);
82+ }
83+
84+ public:
85+ SegmentTree (void ) { a.resize (n << 2 ), cnt.resize (n << 2 ); }
86+ void build (void ) { return build (1 , 1 , n); }
87+ void insert (int p, int v) { return insert (1 , 1 , n, p, v); }
88+ void erase (int p) { return erase (1 , 1 , n, p); }
89+ int query (void ) {
90+ Seg ans = a[1 ][0 ];
91+ assert (ans.vl );
92+ merge (ans.l , ans.r , ans.vl , ans.vl );
93+ assert (ans.l == ans.r );
94+ return ans.l ;
95+ }
96+ };
97+
98+ #define maxn 1000005
99+ #define maxv 1000005
100+
101+ int p[maxn], a[maxn];
102+ int id[maxv];
103+
104+ void solve (void ) {
105+ int n, m;
106+ cin >> n >> m;
107+
108+ SegmentTree SGT;
109+ SGT.build ();
110+
111+ for (int i = 1 ; i <= n; i++) cin >> p[i];
112+ for (int i = 1 ; i <= n; i++) cin >> a[i], id[a[i]] = i, SGT.insert (p[i], a[i]);
113+
114+ while (m--) {
115+ int op;
116+ cin >> op;
117+ if (op == 1 ) {
118+ int x;
119+ cin >> x;
120+ SGT.erase (p[x]);
121+ cin >> p[x];
122+ SGT.insert (p[x], a[x]);
123+ } else
124+ cout << id[SGT.query ()] << endl;
125+ }
126+ }
127+
128+ int main () {
129+ ios::sync_with_stdio (false ), cin.tie (nullptr );
130+
131+ int _ = 1 ;
132+ cin >> _;
133+ while (_--) solve ();
134+
135+ return 0 ;
136+ }
0 commit comments