#include <iostream>
#include <vector>
#include <algorithm>
#include <string>
#include <queue>
#include <set>
#include <map>
#define rep(i, s, e) for (ll i = s; i < e; i++)
#define upmax(a, b) a = max(a, b)
#define upmin(a, b) a = min(a, b)
using namespace std;
using ll = long long;
using vll = vector<ll>;
using vvll = vector<vll>;
using pll = pair<ll, ll>;
using vpll = vector<pll>;
using vvpll = vector<vpll>;
const ll INF = 1e18;
vll depth, par, ans;
map<pll, ll> edges_idx;
vvll tree;
void dfs(ll node, ll papa) {
for (auto& nei : tree[node]) {
if (nei == papa) continue;
depth[nei] = depth[node] + 1;
par[nei] = node;
dfs(nei, node);
}
}
void path(ll a, ll b, vll& idx) {
if (depth[b] > depth[a]) swap(a, b);
while (depth[a] > depth[b]) {
ll mn = min(a, par[a]);
ll mx = max(a, par[a]);
a = par[a];
ll i = edges_idx[{mn, mx}];
if (ans[i] == -1) {
idx.push_back(i);
}
}
while (a != b) {
ll mn = min(a, par[a]);
ll mx = max(a, par[a]);
a = par[a];
ll i = edges_idx[{mn, mx}];
if (ans[i] == -1) {
idx.push_back(i);
}
mn = min(b, par[b]);
mx = max(b, par[b]);
b = par[b];
i = edges_idx[{mn, mx}];
if (ans[i] == -1) {
idx.push_back(i);
}
}
}
void solve() {
ll n, m;
cin >> n >> m;
vpll edges(m);
vector<bool> R(m);
rep(i, 0, m) {
cin >> edges[i].first >> edges[i].second;
edges[i].first--, edges[i].second--;
edges[i] = { min(edges[i].first, edges[i].second), max(edges[i].first, edges[i].second) };
edges_idx[edges[i]] = i;
}
tree.clear(), tree.resize(n);
depth.clear(), depth.resize(n, 0);
par.clear(), par.resize(n, -1);
rep(i, 0, n - 1) {
ll e;
cin >> e;
e--;
R[e] = 1;
tree[edges[e].first].push_back(edges[e].second);
tree[edges[e].second].push_back(edges[e].first);
}
ans.clear(), ans.resize(m, -1);
dfs(0, -1);
ll curW = 1;
rep(i, 0, m) {
if (ans[i] != -1) continue;
else if (R[i]) {
ans[i] = curW;
curW++;
}
else {
vll idx;
path(edges[i].first, edges[i].second, idx);
sort(idx.begin(), idx.end());
rep(j, 0, idx.size()) {
ans[idx[j]] = curW;
curW++;
}
ans[i] = curW;
curW++;
}
}
rep(i, 0, m) cout << ans[i] << ' ';
cout << endl;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
solve();
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |