tmp

Revision en1, by shiraiyui, 2024-10-15 01:36:18

include

include

include

using namespace std; struct tree_node { int l; int r; int min; int max; bool inorder; }; struct list_node { int prev; int next; int num; };

void build(tree_node* tree, int p) { tree[p].min = tree[p].max = -1; tree[p].inorder = true; if (tree[p].l == tree[p].r) return; int mid = tree[p].l + tree[p].r >> 1; tree[p << 1].l = tree[p].l; tree[p << 1].r = mid; tree[(p << 1) + 1].l = mid + 1; tree[(p << 1) + 1].r = tree[p].r; build(tree, p << 1); build(tree, (p << 1) + 1); }

void print(tree_node* tree, int p) { cout << p << " " << tree[p].l << " " << tree[p].r << ' ' << tree[p].max << ' ' << tree[p].min << ' ' << tree[p].inorder << endl; if (tree[p].l == tree[p].r) return; print(tree, p << 1); print(tree, (p << 1) + 1); }

void update(tree_node* tree, int p, int pos, int data) { if (tree[p].l == tree[p].r) { tree[p].min = tree[p].max = data; return; } if (pos <= tree[p].l + tree[p].r >> 1) update(tree, p << 1, pos, data); else update(tree, (p << 1) + 1, pos, data);

if (tree[p << 1].min >= 0) {
    if (tree[(p << 1) + 1].min >= 0) {
       tree[p].min = min(tree[p << 1].min, tree[(p << 1) + 1].min);
       tree[p].max = max(tree[p << 1].max, tree[(p << 1) + 1].max);
    }
    else {
       tree[p].min = tree[p << 1].min;
       tree[p].max = tree[p << 1].max;
    }
}
else {
    if (tree[(p << 1) + 1].min >= 0) {
       tree[p].min = tree[(p << 1) + 1].min;
       tree[p].max = tree[(p << 1) + 1].max;
    }
    else {
       tree[p].min = -1;
       tree[p].max = -1;
    }
}

tree[p].inorder = tree[p << 1].inorder && tree[(p << 1) + 1].inorder &&
    (tree[p << 1].max < tree[(p << 1) + 1].min || tree[p << 1].max == -1 || tree[(p << 1) + 1].min == -1);

}

int main() { int T; cin >> T; while (T--) { int n, m, q; int a[200000]; int b[200000]; tree_node tree[800000]; priority_queue loc[200000]; bool feasible = true; int i; cin >> n >> m >> q; tree[1].l = 0; tree[1].r = n — 1; build(tree, 1); for (i = 0; i < n; i++) { int tmp; cin >> tmp; a[tmp] = i; } for (i = 0; i < m; i++) { int tmp; cin >> tmp; b[i] = a[tmp]; if (loc[b[i]].empty()) { update(tree, 1, b[i], i); } loc[b[i]].emplace(i); } if (tree[1].inorder) cout << "YA\n"; else cout << "TIDAK\n"; for (i = 0; i < q; i++) { int s, t; cin >> s >> t; if (b[--s] != a[t]) { b[s] = a[t]; if (loc[a[t]].top()) {} } } } return 0; }

History

 
 
 
 
Revisions
 
 
  Rev. Lang. By When Δ Comment
en1 English shiraiyui 2024-10-15 01:36:18 2573 Initial revision (published)