#include <bits/stdc++.h>
using namespace std;
const int MAX = 500000;
vector<int> cnt;
vector<int> st;
struct tree {
tree(int n) {
for(size = 1; size < n; size *= 2);
V.resize(2*size);
val.resize(2*size);
all.resize(size+1);
}
void set(int x, int v) {
val[x+size] = v;
}
void add(int x, pair<int,int> v) {
V[x+size].push_back(v);
}
void build() {
for (int k = size / 2; k > 0; k /= 2) {
auto &al = all[k];
for (int t = k; t < 2 * k; t++) {
int i = 0, j = 0;
int hi = val[2*t], hj = val[2*t+1];
al.push_back({hi, hj});
// printf("%d %d: %d %d\n", k, t, hi, hj);
while (i < (int)V[2*t].size() || j < (int)V[2*t+1].size()) {
if (i == (int)V[2*t].size()) {
hj = V[2*t+1][j++].second;
} else if (j == (int)V[2*t+1].size()) {
hi = V[2*t][i++].second;
} else {
if (V[2*t][i].first < V[2*t+1][j].first) {
hi = V[2*t][i++].second;
} else {
hj = V[2*t+1][j++].second;
}
}
al.push_back({hi, hj});
// printf("%d %d: %d %d\n", k, t, hi, hj);
}
}
{
if (k == size / 2) {
sort(al.begin(), al.end());
} else {
int mx = 0;
for (auto const& p : al) {
mx = max(mx, max(p.first, p.second));
}
cnt.assign(mx+1, 0);
auto tmp = al;
for (auto const& p : al) {
cnt[p.second]++;
}
for (int i = 0; i < mx; i++) {
cnt[i+1] += cnt[i];
}
for (int i = 0; i < (int)al.size(); i++) {
tmp[--cnt[al[i].second]] = al[i];
}
cnt.assign(mx+1, 0);
for (auto const& p : tmp) {
cnt[p.first]++;
}
for (int i = 0; i < mx; i++) {
cnt[i+1] += cnt[i];
}
for (int i = (int)al.size() - 1; i >= 0; i--) {
al[--cnt[tmp[i].first]] = tmp[i];
}
}
}
al.erase(unique(al.begin(), al.end()), al.end());
if (k != size / 2) {
st.assign(al.back().first+2, -1);
st.back() = al.size();
for (int i = (int)al.size()-1; i >= 0; i--) {
st[al[i].first] = i;
}
for (int i = (int)st.size()-2; i >= 0; i--) {
if (st[i] == -1) {
st[i] = st[i+1];
}
}
}
// printf("%d %d\n", k, (int)al.size());
for (int t = k; t < 2 * k; t++) {
// V[t].reserve(V[2*t].size() + V[2*t+1].size());
auto b = al.begin();
auto e = al.end();
if (k != size / 2) {
b = al.begin() + st[val[2*t]];
e = al.begin() + st[val[2*t]+1];
}
val[t] = lower_bound(b, e, pair<int,int>{val[2*t], val[2*t+1]}) - al.begin();
// printf("val %d = %d\n", t, val[t]);
int i = 0, j = 0;
int hi = val[2*t], hj = val[2*t+1];
// printf("%d %d: %d %d\n", k, t, hi, hj);
while (i < (int)V[2*t].size() || j < (int)V[2*t+1].size()) {
int tim;
if (i == (int)V[2*t].size()) {
tim = V[2*t+1][j].first;
hj = V[2*t+1][j++].second;
} else if (j == (int)V[2*t+1].size()) {
tim = V[2*t][i].first;
hi = V[2*t][i++].second;
} else {
if (V[2*t][i].first < V[2*t+1][j].first) {
tim = V[2*t][i].first;
hi = V[2*t][i++].second;
} else {
tim = V[2*t+1][j].first;
hj = V[2*t+1][j++].second;
}
}
b = al.begin();
e = al.end();
if (k != size / 2) {
b = al.begin() + st[hi];
e = al.begin() + st[hi+1];
}
int h = lower_bound(b, e, pair<int,int>{hi, hj}) - al.begin();
V[t].push_back({tim, h});
// printf("pb %d %d: %d %d\n", k, t, tim, h);
}
}
}
}
int root_hash(int c) {
int ret;
if (c == 0) {
ret = val[1];
} else {
ret = V[1][c-1].second;
}
return ret;
}
vector<vector<pair<int,int>>> V;
vector<int> val;
vector<vector<pair<int, int>>> all;
int size;
};
int main() {
int n, m;
scanf("%d %d", &n, &m);
tree T(n);
for (int i = 0; i < n; i++) {
int t;
scanf("%d", &t);
T.set(i, t);
}
for (int i = 1; i < m; i++) {
int x, t;
scanf("%d %d", &x, &t);
x--;
T.add(x, {i, t});
}
T.build();
vector<pair<int,int>> P;
P.push_back({T.root_hash(0), 0});
for (int i = 1; i < m; i++) {
P.push_back({T.root_hash(i), i});
}
sort(P.begin(), P.end());
for (auto p : P) {
printf("%d ", p.second+1);
}
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 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 | #include <bits/stdc++.h> using namespace std; const int MAX = 500000; vector<int> cnt; vector<int> st; struct tree { tree(int n) { for(size = 1; size < n; size *= 2); V.resize(2*size); val.resize(2*size); all.resize(size+1); } void set(int x, int v) { val[x+size] = v; } void add(int x, pair<int,int> v) { V[x+size].push_back(v); } void build() { for (int k = size / 2; k > 0; k /= 2) { auto &al = all[k]; for (int t = k; t < 2 * k; t++) { int i = 0, j = 0; int hi = val[2*t], hj = val[2*t+1]; al.push_back({hi, hj}); // printf("%d %d: %d %d\n", k, t, hi, hj); while (i < (int)V[2*t].size() || j < (int)V[2*t+1].size()) { if (i == (int)V[2*t].size()) { hj = V[2*t+1][j++].second; } else if (j == (int)V[2*t+1].size()) { hi = V[2*t][i++].second; } else { if (V[2*t][i].first < V[2*t+1][j].first) { hi = V[2*t][i++].second; } else { hj = V[2*t+1][j++].second; } } al.push_back({hi, hj}); // printf("%d %d: %d %d\n", k, t, hi, hj); } } { if (k == size / 2) { sort(al.begin(), al.end()); } else { int mx = 0; for (auto const& p : al) { mx = max(mx, max(p.first, p.second)); } cnt.assign(mx+1, 0); auto tmp = al; for (auto const& p : al) { cnt[p.second]++; } for (int i = 0; i < mx; i++) { cnt[i+1] += cnt[i]; } for (int i = 0; i < (int)al.size(); i++) { tmp[--cnt[al[i].second]] = al[i]; } cnt.assign(mx+1, 0); for (auto const& p : tmp) { cnt[p.first]++; } for (int i = 0; i < mx; i++) { cnt[i+1] += cnt[i]; } for (int i = (int)al.size() - 1; i >= 0; i--) { al[--cnt[tmp[i].first]] = tmp[i]; } } } al.erase(unique(al.begin(), al.end()), al.end()); if (k != size / 2) { st.assign(al.back().first+2, -1); st.back() = al.size(); for (int i = (int)al.size()-1; i >= 0; i--) { st[al[i].first] = i; } for (int i = (int)st.size()-2; i >= 0; i--) { if (st[i] == -1) { st[i] = st[i+1]; } } } // printf("%d %d\n", k, (int)al.size()); for (int t = k; t < 2 * k; t++) { // V[t].reserve(V[2*t].size() + V[2*t+1].size()); auto b = al.begin(); auto e = al.end(); if (k != size / 2) { b = al.begin() + st[val[2*t]]; e = al.begin() + st[val[2*t]+1]; } val[t] = lower_bound(b, e, pair<int,int>{val[2*t], val[2*t+1]}) - al.begin(); // printf("val %d = %d\n", t, val[t]); int i = 0, j = 0; int hi = val[2*t], hj = val[2*t+1]; // printf("%d %d: %d %d\n", k, t, hi, hj); while (i < (int)V[2*t].size() || j < (int)V[2*t+1].size()) { int tim; if (i == (int)V[2*t].size()) { tim = V[2*t+1][j].first; hj = V[2*t+1][j++].second; } else if (j == (int)V[2*t+1].size()) { tim = V[2*t][i].first; hi = V[2*t][i++].second; } else { if (V[2*t][i].first < V[2*t+1][j].first) { tim = V[2*t][i].first; hi = V[2*t][i++].second; } else { tim = V[2*t+1][j].first; hj = V[2*t+1][j++].second; } } b = al.begin(); e = al.end(); if (k != size / 2) { b = al.begin() + st[hi]; e = al.begin() + st[hi+1]; } int h = lower_bound(b, e, pair<int,int>{hi, hj}) - al.begin(); V[t].push_back({tim, h}); // printf("pb %d %d: %d %d\n", k, t, tim, h); } } } } int root_hash(int c) { int ret; if (c == 0) { ret = val[1]; } else { ret = V[1][c-1].second; } return ret; } vector<vector<pair<int,int>>> V; vector<int> val; vector<vector<pair<int, int>>> all; int size; }; int main() { int n, m; scanf("%d %d", &n, &m); tree T(n); for (int i = 0; i < n; i++) { int t; scanf("%d", &t); T.set(i, t); } for (int i = 1; i < m; i++) { int x, t; scanf("%d %d", &x, &t); x--; T.add(x, {i, t}); } T.build(); vector<pair<int,int>> P; P.push_back({T.root_hash(0), 0}); for (int i = 1; i < m; i++) { P.push_back({T.root_hash(i), i}); } sort(P.begin(), P.end()); for (auto p : P) { printf("%d ", p.second+1); } printf("\n"); } |
English