#include <bits/stdc++.h> // #pragma GCC optimize ("O3") // #pragma GCC target ("sse4") using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> PII; #define REP(i,n) for(int i=0;i<(n);++i) #define FOR(i,a,b) for (int i=(a); i<(b); ++i) #define FORD(i,a,b) for (int i=(a)-1; i>=(b); --i) #define pb push_back #define mp make_pair #define st first #define nd second int NC = 1; struct Node { int left_child; int right_child; int in_order; }; Node nodes[12000000]; vector<int> by_level[20]; int T[600000]; int create(int A, int B, int l) { by_level[l].pb(NC); Node& n = nodes[NC++]; if (l == 0) { n.in_order = T[A]; } else { n.left_child = create(A, (A+B)/2, l-1); n.right_child = create((A+B)/2, B, l-1); } return &n - nodes; } int replace(int n, int A, int B, int l, int pos, int value) { const Node& current_node = nodes[n]; by_level[l].pb(NC); Node& new_node = nodes[NC++]; if (A + 1 == B) { new_node.in_order = value; } else { if (pos < (A+B)/2) { new_node.left_child = replace(current_node.left_child, A, (A+B)/2, l-1, pos, value); new_node.right_child = current_node.right_child; } else { new_node.left_child = current_node.left_child; new_node.right_child = replace(current_node.right_child, (A+B)/2, B, l-1, pos, value); } } return &new_node - nodes; } void print(int node, int level) { if (level == 0) printf("%d ", nodes[node].in_order); else { print(nodes[node].left_child, level-1); print(nodes[node].right_child, level-1); } } void sort_level(int level) { vector<pair<PII, int>> data; for (int n: by_level[level]) { data.pb({ { nodes[nodes[n].left_child].in_order, nodes[nodes[n].right_child].in_order}, n }); } sort(data.begin(), data.end()); PII cur = {-1, -1}; int in_order = 0; for (auto p: data) { if (p.st != cur) { ++in_order; cur = p.st; } nodes[p.nd].in_order = in_order; } } int nodenum[1000000]; int main() { // ios_base::sync_with_stdio(0); int N, M; scanf("%d%d", &N, &M); REP(i,N) scanf("%d", &T[i]); int levels = 1; { int N2 = 1; while (N2 < N) { N2 <<= 1; ++levels; } N = N2; } nodenum[1] = create(0, N, levels-1); FOR(i,2,M+1) { int p, x; scanf("%d%d", &p, &x); nodenum[i] = replace(nodenum[i-1], 0, N, levels-1, p-1, x); } FOR(level,1,levels) { sort_level(level); } vector<PII> vec; FOR(i,1,M+1) vec.pb({nodes[nodenum[i]].in_order, i}); sort(vec.begin(), vec.end()); for (auto p: vec) printf("%d ", p.nd); printf("\n"); }
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 | #include <bits/stdc++.h> // #pragma GCC optimize ("O3") // #pragma GCC target ("sse4") using namespace std; typedef long long LL; typedef unsigned long long ULL; typedef pair<int,int> PII; #define REP(i,n) for(int i=0;i<(n);++i) #define FOR(i,a,b) for (int i=(a); i<(b); ++i) #define FORD(i,a,b) for (int i=(a)-1; i>=(b); --i) #define pb push_back #define mp make_pair #define st first #define nd second int NC = 1; struct Node { int left_child; int right_child; int in_order; }; Node nodes[12000000]; vector<int> by_level[20]; int T[600000]; int create(int A, int B, int l) { by_level[l].pb(NC); Node& n = nodes[NC++]; if (l == 0) { n.in_order = T[A]; } else { n.left_child = create(A, (A+B)/2, l-1); n.right_child = create((A+B)/2, B, l-1); } return &n - nodes; } int replace(int n, int A, int B, int l, int pos, int value) { const Node& current_node = nodes[n]; by_level[l].pb(NC); Node& new_node = nodes[NC++]; if (A + 1 == B) { new_node.in_order = value; } else { if (pos < (A+B)/2) { new_node.left_child = replace(current_node.left_child, A, (A+B)/2, l-1, pos, value); new_node.right_child = current_node.right_child; } else { new_node.left_child = current_node.left_child; new_node.right_child = replace(current_node.right_child, (A+B)/2, B, l-1, pos, value); } } return &new_node - nodes; } void print(int node, int level) { if (level == 0) printf("%d ", nodes[node].in_order); else { print(nodes[node].left_child, level-1); print(nodes[node].right_child, level-1); } } void sort_level(int level) { vector<pair<PII, int>> data; for (int n: by_level[level]) { data.pb({ { nodes[nodes[n].left_child].in_order, nodes[nodes[n].right_child].in_order}, n }); } sort(data.begin(), data.end()); PII cur = {-1, -1}; int in_order = 0; for (auto p: data) { if (p.st != cur) { ++in_order; cur = p.st; } nodes[p.nd].in_order = in_order; } } int nodenum[1000000]; int main() { // ios_base::sync_with_stdio(0); int N, M; scanf("%d%d", &N, &M); REP(i,N) scanf("%d", &T[i]); int levels = 1; { int N2 = 1; while (N2 < N) { N2 <<= 1; ++levels; } N = N2; } nodenum[1] = create(0, N, levels-1); FOR(i,2,M+1) { int p, x; scanf("%d%d", &p, &x); nodenum[i] = replace(nodenum[i-1], 0, N, levels-1, p-1, x); } FOR(level,1,levels) { sort_level(level); } vector<PII> vec; FOR(i,1,M+1) vec.pb({nodes[nodenum[i]].in_order, i}); sort(vec.begin(), vec.end()); for (auto p: vec) printf("%d ", p.nd); printf("\n"); } |