Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <cstring>
- #include <vector>
- using namespace std;
- const int NMAX = 100000;
- const int LOG = 17;
- struct muchie {
- int x, d;
- muchie (int x = 0, int d = 1):
- x (x), d (d) {}
- };
- int N, M, l, rad1, rad2;
- int t[2][NMAX + 1][LOG + 1];
- int dist[2][NMAX + 1], niv[2][NMAX + 1];
- bool viz[NMAX + 1];
- vector <muchie> v[NMAX + 1];
- void citire () {
- int x, y, d;
- scanf ("%d%d", &N, &M);
- for (int i = 1; i < N; ++i) {
- scanf ("%d%d%d", &x, &y, &d);
- v[x].push_back (muchie (y, d));
- v[y].push_back (muchie (x, d));
- }
- }
- void dfs (int nod) {
- viz[nod] = true;
- for (int i = 0; i < v[nod].size (); ++i) {
- muchie fiu = v[nod][i];
- if (!viz[fiu.x]) {
- dist[l][fiu.x] = dist[l][nod] + fiu.d;
- dfs (fiu.x);
- }
- }
- viz[nod] = false;
- }
- void diametru () {
- int dmax = -1;
- l = 0;
- dfs (1);
- for (int i = 1; i <= N; ++i) {
- if (dist[0][i] > dmax) {
- dmax = dist[0][i];
- rad1 = i;
- }
- }
- dmax = -1;
- dist[0][rad1] = 0;
- l = 0;
- dfs (rad1);
- for (int i = 1; i <= N; ++i) {
- if (dist[0][i] > dmax) {
- dmax = dist[0][i];
- rad2 = i;
- }
- }
- l = 1;
- dfs (rad2);
- }
- void calcT (int nod) {
- viz[nod] = true;
- for (int i = 1; (1 << i) <= niv[l][nod]; ++i)
- t[l][nod][i] = t[l][t[l][nod][i - 1]][i - 1];
- for (int i = 0; i < v[nod].size (); ++i) {
- muchie fiu = v[nod][i];
- if (!viz[fiu.x]) {
- niv[l][fiu.x] = niv[l][nod] + 1;
- t[l][fiu.x][0] = nod;
- calcT (fiu.x);
- }
- }
- viz[nod] = false;
- }
- void smenulDeLaStramosi () {
- l = 0;
- calcT (rad1);
- l = 1;
- calcT (rad2);
- }
- void sol (int nod, int d, int l) {
- if (d <= ((dist[l][nod] - dist[l][t[l][nod][0]])))
- printf ("%d %d %d\n", nod, t[l][nod][0], d);
- else {
- int i = 0, p;
- while ((1 << i) <= niv[l][nod]) {
- p = t[l][nod][i];
- if (dist[l][nod] - dist[l][p] > d) {
- --i;
- p = t[l][nod][i];
- break;
- } else
- ++i;
- }
- if (d == (dist[l][nod] - dist[l][p]))
- printf ("%d %d %d\n", p, nod, 0);
- else
- sol (p, d - (dist[l][nod] - dist[l][p]), l);
- }
- }
- void rezolva () {
- int x, d;
- for (int i = 1; i <= M; ++i) {
- scanf ("%d%d", &x, &d);
- if (dist[0][x] >= d)
- sol (x, d, 0);
- else if (dist[1][x] >= d)
- sol (x, d, 1);
- else
- printf ("'Am festelit smerenghelul'\n");
- }
- }
- int main () {
- freopen ("hacker2.in", "r", stdin);
- freopen ("hacker2.out", "w", stdout);
- citire ();
- diametru ();
- smenulDeLaStramosi ();
- rezolva ();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement