1+ /* *
2+ * @file 6106.cpp
3+ * @author Macesuted (i@macesuted.moe)
4+ * @date 2025-09-05
5+ *
6+ * @copyright Copyright (c) 2025
7+ *
8+ */
9+
10+ #include < bits/stdc++.h>
11+ using namespace std ;
12+
13+ #ifndef LOCAL
14+ #define endl ' \n '
15+ #endif
16+
17+ bool mem1;
18+
19+ #define maxn 100005
20+
21+ class SegmentTree {
22+ private:
23+ array<int , 10 > a[maxn << 2 ];
24+ int n;
25+
26+ array<int , 10 > merge (const array<int , 10 >& x, const array<int , 10 >& y) {
27+ array<int , 10 > ans = x;
28+ for (int i = 0 ; i < 10 ; i++) ans[i] += y[i];
29+ return ans;
30+ }
31+
32+ void build (int p, int l, int r, const string& s) {
33+ if (l == r) {
34+ x[l] = s[l - 1 ] - ' 0' ;
35+ for (int t = 0 ; t < 10 ; t++) a[p][t] = (x[l] == t);
36+ return ;
37+ }
38+ int mid = (l + r) >> 1 ;
39+ build (p << 1 , l, mid, s), build (p << 1 | 1 , mid + 1 , r, s);
40+ return a[p] = merge (a[p << 1 ], a[p << 1 | 1 ]), void ();
41+ }
42+ void update (int p, int l, int r, int qp, int v) {
43+ if (l == r) return a[p][x[l]]--, a[p][x[l] = v]++, void ();
44+ int mid = (l + r) >> 1 ;
45+ qp <= mid ? update (p << 1 , l, mid, qp, v) : update (p << 1 | 1 , mid + 1 , r, qp, v);
46+ return a[p] = merge (a[p << 1 ], a[p << 1 | 1 ]), void ();
47+ }
48+ array<int , 10 > getPre (int p, int l, int r, int qp) {
49+ if (r <= qp) return a[p];
50+ int mid = (l + r) >> 1 ;
51+ if (qp <= mid) return getPre (p << 1 , l, mid, qp);
52+ return merge (a[p << 1 ], getPre (p << 1 | 1 , mid + 1 , r, qp));
53+ }
54+ int getNext (int p, int l, int r, int qp) {
55+ if (a[p][x[qp]] == r - l + 1 ) return n + 1 ;
56+ if (l == r) return l;
57+ int mid = (l + r) >> 1 ;
58+ if (qp <= mid) {
59+ int ans = getNext (p << 1 , l, mid, qp);
60+ if (ans != n + 1 ) return ans;
61+ }
62+ return getNext (p << 1 | 1 , mid + 1 , r, qp);
63+ }
64+
65+ public:
66+ int x[maxn];
67+
68+ void build (const string& s) { return build (1 , 1 , n = s.size (), s); }
69+ void update (int p, int v) { return update (1 , 1 , n, p, v); }
70+ array<int , 10 > getPre (int p) { return getPre (1 , 1 , n, p); }
71+ int getNext (int p) { return getNext (1 , 1 , n, p); }
72+ } SGT;
73+
74+ array<int , 10 > cnt;
75+
76+ void solve (void ) {
77+ string X, Y;
78+ cin >> X >> Y;
79+
80+ int n = X.size ();
81+ for (int i = 0 ; i < 10 ; i++) cnt[i] = 0 ;
82+ for (int i = 0 ; i < n; i++) cnt[X[i] - ' 0' ]++;
83+ SGT.build (Y);
84+
85+ auto chk = [&](int p) -> bool {
86+ array<int , 10 > cnt = ::cnt;
87+ if (p) {
88+ array<int , 10 > pre = SGT.getPre (p);
89+ for (int i = 0 ; i < 10 ; i++)
90+ if ((cnt[i] -= pre [i]) < 0 ) return false ;
91+ }
92+
93+ for (int t = 9 , i = p + 1 ; t >= 0 ; t--) {
94+ if (!cnt[t]) continue ;
95+ if (t != SGT.x [i]) return t > SGT.x [i];
96+ int len = SGT.getNext (i) - i, rlen = min (len, cnt[t]);
97+ len -= rlen, i += rlen;
98+ cnt[t] -= rlen;
99+ if (cnt[t]) return t > SGT.x [i];
100+ }
101+ return true ;
102+ };
103+
104+ int q;
105+ cin >> q;
106+ while (q--) {
107+ int op, i;
108+ cin >> op >> i;
109+ if (op == 1 ) {
110+ int x;
111+ cin >> x;
112+ SGT.update (i, x);
113+ } else {
114+ if (!chk (0 )) {
115+ cout << -1 << endl;
116+ continue ;
117+ }
118+
119+ int l = 0 , r = n + 1 ;
120+ while (l + 1 < r) {
121+ int mid = (l + r) >> 1 ;
122+ (chk (mid) ? l : r) = mid;
123+ }
124+
125+ if (i <= l) {
126+ cout << SGT.x [i] << endl;
127+ continue ;
128+ }
129+
130+ array<int , 10 > cnt = ::cnt;
131+ if (l) {
132+ array<int , 10 > pre = SGT.getPre (l);
133+ for (int i = 0 ; i < 10 ; i++) cnt[i] -= pre [i];
134+ }
135+
136+ int d = SGT.x [r] + 1 ;
137+ while (!cnt[d]) d++;
138+ if (i == r) {
139+ cout << d << endl;
140+ continue ;
141+ }
142+ cnt[d]--;
143+
144+ for (int t = 0 , p = r; t <= 9 ; p += cnt[t++])
145+ if (i <= p + cnt[t]) {
146+ cout << t << endl;
147+ break ;
148+ }
149+ }
150+ }
151+
152+ return ;
153+ }
154+
155+ bool mem2;
156+
157+ int main () {
158+ ios::sync_with_stdio (false ), cin.tie (nullptr );
159+ #ifdef LOCAL
160+ cerr << " Memory Cost: " << abs (&mem1 - &mem2) / 1024 . / 1024 . << " MB" << endl;
161+ #endif
162+
163+ int _ = 1 ;
164+ while (_--) solve ();
165+
166+ #ifdef LOCAL
167+ cerr << " Time Cost: " << clock () * 1000 . / CLOCKS_PER_SEC << " MS" << endl;
168+ #endif
169+ return 0 ;
170+ }
0 commit comments