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
| #include <bits/stdc++.h> using namespace std; const int N = 4e5 + 5; int t, x, y, q, a[N], m[N], s[N], tree[N], n; int build(int i, int l, int r) { if (l == r) return tree[i] = a[l]; return tree[i] = min(build(i * 2, l, (l + r) / 2), build(i * 2 + 1, (l + r) / 2 + 1, r)); } int query(int i, int l, int r) { if (y < l || r < x) return 0x7f7f7f7f; if (x <= l && r <= y) return tree[i]; return min(query(i * 2, l, (l + r) / 2), query(i * 2 + 1, (l + r) / 2 + 1, r)); } int modify(int i, int l, int r) { if (l == r && l == x) return tree[i] = y; if (x < l || r < x) return tree[i]; return tree[i] = min(modify(i * 2, l, (l + r) / 2), modify(i * 2 + 1, (l + r) / 2 + 1, r)); } int main() { cin >> t; for (int i = 1; i <= t; i++) { cin >> m[i]; s[i] = s[i - 1] + m[i]; for (int j = 1; j <= m[i]; j++) cin >> a[++n]; } memset(tree, 0x7f, sizeof(tree)); build(1, 1, n); cin >> q; while (q--) { int op; cin >> op; if (op == 1) { int i, j; cin >> i >> j >> y; x = s[i - 1] + j; modify(1, 1, n); } else { int i; cin >> i; x = 1, y = s[i]; cout << query(1, 1, n) << "\n"; } } }
|