Submission details
Task:Hacker
Sender:multiply and surrender
Submission time:2015-09-16 19:45:56 +0300
Language:C++
Status:READY
Result:ACCEPTED
Test results
testverdicttime
#1ACCEPTED0.06 sdetails
#2ACCEPTED0.06 sdetails
#3ACCEPTED0.06 sdetails
#4ACCEPTED0.06 sdetails
#5ACCEPTED0.06 sdetails
#6ACCEPTED0.06 sdetails
#7ACCEPTED0.05 sdetails
#8ACCEPTED0.06 sdetails
#9ACCEPTED0.06 sdetails
#10ACCEPTED0.06 sdetails
#11ACCEPTED0.30 sdetails
#12ACCEPTED0.30 sdetails
#13ACCEPTED0.30 sdetails
#14ACCEPTED0.30 sdetails
#15ACCEPTED0.29 sdetails
#16ACCEPTED0.30 sdetails
#17ACCEPTED0.30 sdetails
#18ACCEPTED0.30 sdetails
#19ACCEPTED0.30 sdetails
#20ACCEPTED0.31 sdetails
#21ACCEPTED0.29 sdetails
#22ACCEPTED0.38 sdetails
#23ACCEPTED0.29 sdetails
#24ACCEPTED0.29 sdetails
#25ACCEPTED0.39 sdetails
#26ACCEPTED0.28 sdetails
#27ACCEPTED0.28 sdetails
#28ACCEPTED0.33 sdetails
#29ACCEPTED0.29 sdetails
#30ACCEPTED0.29 sdetails
#31ACCEPTED0.33 sdetails
#32ACCEPTED0.29 sdetails
#33ACCEPTED0.30 sdetails
#34ACCEPTED0.28 sdetails
#35ACCEPTED0.29 sdetails
#36ACCEPTED0.28 sdetails

Compiler report

input/code.cpp: In function 'int dfs(int, int, int)':
input/code.cpp:112:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for (int j=0;j<v[i].size();j++) {
                ^
input/code.cpp: In function 'int main()':
input/code.cpp:162:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for (int j=0;j<v[p4].size();j++) {
                  ^
input/code.cpp:183:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    for (int j=0;j<v[tmp].size();j++) {
                  ^

Code

#include <iostream>
#include <vector>
#include <deque>

#define mp make_pair
#define F first
#define S second
#define N (1<<19)

using namespace std;

pair<int,int> sPuu[2*N];
int ind;
int k[201010];
vector<int> v[201010];
int n,m;
int u,w,d;
int visit[201010];
int dep[201010];
int asd[201010];

int par[201010][18];
int chk[201010];
int q1,p1, q2,p2;
deque<int> dq;
deque<int> dq2;

int rise(int i, int k) {
	int res = i;
	int hlp = 0;
	while (k>0) {
		if(k%2 == 1) {
			res = par[res][hlp];
		}
		hlp++;
		k/=2;
	}
//	cout << "RISEN\n";
	return res;
}

void makeTree() {
	for (int j=N-1;j>0;j--) {
		if (sPuu[2*j].S > sPuu[2*j+1].S) sPuu[j] = sPuu[2*j+1];
		else sPuu[j] = sPuu[2*j];
	}
//	cout << "TREE MADE\n";
}

int askDist(int i,int j) {
	int i1 = k[i]; int j1 = k[j];
	int parsa = 101010101;
	if (i1>j1) swap(i1,j1);
	while (i1<=j1) {
		if (i1%2 == 1) {
			if (sPuu[i1].S < parsa) {
				parsa = sPuu[i1].S;
				
			}
			i1++;
		}
		if (j1%2 == 0) {
			if (parsa > sPuu[j1].S) {
				parsa = sPuu[j1].S;
				
			}
			j1--;
		}
		i1/=2; j1/=2;
//		cout << i1 << " " << j1 << "\n";
	}
//	cout << "DIST ASKED\n";
	return sPuu[k[i]].S + sPuu[k[j]].S -2*parsa;
}

int askPar(int i,int j) {
	i=k[i];j=k[j];
	if (i>j) swap(i,j);
	int parsa = 1010101010;
	int parind = -1;
	while (i<=j) {
		if (i%2 == 1) {
			if (sPuu[i].S < parsa) {
				parsa = sPuu[i].S;
				parind = sPuu[i].F;
			}
			i++;
		}
		if (j%2 == 0) {
			if (sPuu[j].S < parsa) {
				parsa = sPuu[j].S;
				parind = sPuu[j].F;
			}
			j--;
		}
		i/=2;
		j/=2;
	}
//	cout << "PARENT ASKED\n";
	return parind;
}

int dfs(int i,int dist, int l) {
	if (visit[i]) return 0;
	par[i][0] = l;
	for (int j=1;j<18;j++) par[i][j] = par[par[i][j-1]][j-1];
	k[i] = N+ind;
//	cout << i << ": " << k[i] << "\n";
	sPuu[N+ind] = mp(i,dist);
	ind++;
	visit[i] = 1;
	for (int j=0;j<v[i].size();j++) {
		if (dfs(v[i][j],dist+1,i)) {
			sPuu[N+ind] = mp(i,dist);
			ind++;
		}
	}
	return 1;
}

int main() {
	cin >> n >> m;
	for (int i=1;i<n;i++) {
		cin >> u >> w;
		v[u].push_back(w);
		v[w].push_back(u);
	}
	dfs(1,1,0);
//	cout << "DFS READY\n";

	makeTree();
	cin >> p1 >> q1;
	chk[p1] = 1;
	for (int i=1;i<m;i++) {
		cin >> p2 >> q2;
		if (chk[p2]) continue;
//		cout << "ASKING DIST\n";
		int distance = askDist(p1,p2);
		int tmp = askPar(p1,p2);
		if (distance == q1+q2) {
			cout << "1 ";
			if (askDist(tmp,p1) > q1) {
				cout << rise(p1,q1) << "\n";
			} else {
				cout << rise(p2,q2) << "\n";
			}
			return 0;
		}
		int p3;
		int q3 = (q1+q2-distance)/2;
		if (askDist(tmp, p1) > q1 - q3) {
			p3 = rise(p1,q1-q3);
		} else {
			p3 = rise(p2,q2-q3);
		}
		if (p1 != p3) dq.push_back(p1);
		if (p2 != p3) dq.push_back(p2);
		while(!dq.empty()) {
			int p4 = dq.back();
			dq.pop_back();
			chk[p4] = 1;
			for (int j=0;j<v[p4].size();j++) {
				if (v[p4][j] != p3 && !chk[v[p4][j]]) dq.push_back(v[p4][j]);
			}
		}
		p1 = p3;
		q1 = q3;
	}

	dq.push_back(p1);
	dq2.push_back(0);
	asd[p1] = 1;
	int val = 0;
	int parsa = -1;
	while (!dq.empty()) {
		int tmp = dq.back();
		dq.pop_back();
		asd[tmp] = 1;
		int fasd = dq2.back();
		dq2.pop_back();
		if (fasd == q1) {val++;if (parsa == -1) parsa = tmp;}
		else {
			for (int j=0;j<v[tmp].size();j++) {
				if (!asd[v[tmp][j]] && !chk[v[tmp][j]]) {
					dq.push_back(v[tmp][j]);
					dq2.push_back(fasd+1);
				}
			}
		}
	}
	cout << val << " " << parsa << "\n";
}

Test details

Test 1

Verdict: ACCEPTED

input
5 3
2 1
1 4
2 3
4 5
...

correct output
1

user output
1 3

Test 2

Verdict: ACCEPTED

input
2 1
2 1
1 1

correct output
1

user output
1 2

Test 3

Verdict: ACCEPTED

input
4 2
1 3
3 4
2 1
3 1
...

correct output
1

user output
1 4

Test 4

Verdict: ACCEPTED

input
8 4
3 8
3 7
3 2
5 8
...

correct output
1

user output
1 4

Test 5

Verdict: ACCEPTED

input
8 2
1 5
2 1
5 4
7 5
...

correct output
1

user output
1 1

Test 6

Verdict: ACCEPTED

input
88 58
16 63
16 55
45 16
16 76
...

correct output
1
16 

user output
1 16

Test 7

Verdict: ACCEPTED

input
90 34
3 30
33 3
3 1
3 16
...

correct output
1
73 

user output
1 73

Test 8

Verdict: ACCEPTED

input
68 64
65 37
26 37
37 2
37 16
...

correct output
1
14 

user output
1 14

Test 9

Verdict: ACCEPTED

input
98 90
82 89
89 72
89 24
89 66
...

correct output
1
38 

user output
1 38

Test 10

Verdict: ACCEPTED

input
45 43
16 24
11 24
24 14
39 16
...

correct output
1
11 

user output
1 11

Test 11

Verdict: ACCEPTED

input
200000 10000
108969 124359
95689 6026
116305 139666
24031 23504
...

correct output
2269
100022 100029 100048 100187 10...

user output
2269 101746

Test 12

Verdict: ACCEPTED

input
200000 30000
149634 101097
7189 8578
110942 104503
110094 199531
...

correct output
12594
100006 100022 100025 100028 10...

user output
12594 150940

Test 13

Verdict: ACCEPTED

input
200000 10001
9664 10422
101570 162282
21567 87519
75017 10098
...

correct output
4469
100033 100068 100071 100074 10...

user output
4469 121647

Test 14

Verdict: ACCEPTED

input
200000 30001
192593 161643
133646 146752
70341 87021
85165 3436
...

correct output
646
100376 100431 100629 100865 10...

user output
646 193832

Test 15

Verdict: ACCEPTED

input
200000 10003
182120 107802
111504 176786
116392 192800
39491 8466
...

correct output
1
187998 

user output
1 187998

Test 16

Verdict: ACCEPTED

input
200000 30003
100234 176124
72445 20075
27078 77532
6054 17091
...

correct output
1013
100101 100226 100318 100331 10...

user output
1013 110542

Test 17

Verdict: ACCEPTED

input
200000 11000
144259 147062
129144 34375
27688 122452
149687 178943
...

correct output
9
68155 74343 92593 98229 103701...

user output
9 68155

Test 18

Verdict: ACCEPTED

input
200000 20000
90535 65281
89691 120083
89310 122019
48389 89987
...

correct output
13
31911 56441 62585 103301 11475...

user output
13 114756

Test 19

Verdict: ACCEPTED

input
200000 10010
126094 109522
32134 117141
77008 145100
95190 29985
...

correct output
841
150165 150222 150264 150414 15...

user output
841 188392

Test 20

Verdict: ACCEPTED

input
200000 5000
125110 185897
185897 15293
185897 65525
32273 15293
...

correct output
1
120494 

user output
1 120494

Test 21

Verdict: ACCEPTED

input
200000 10000
29178 72745
65717 29178
86262 72745
28578 72745
...

correct output
2
70740 146957 

user output
2 70740

Test 22

Verdict: ACCEPTED

input
200000 100000
68474 3445
68474 188768
75980 188768
53957 75980
...

correct output
1
130925 

user output
1 130925

Test 23

Verdict: ACCEPTED

input
200000 5000
199775 110116
20398 110116
131291 110116
20398 105072
...

correct output
1
142994 

user output
1 142994

Test 24

Verdict: ACCEPTED

input
200000 10000
14706 98422
143108 14706
183282 14706
177517 14706
...

correct output
1
24321 

user output
1 24321

Test 25

Verdict: ACCEPTED

input
200000 100000
98965 122949
80666 98965
98965 122727
80666 94692
...

correct output
1
89572 

user output
1 89572

Test 26

Verdict: ACCEPTED

input
200000 5000
175908 116198
108345 116198
116198 46371
108738 175908
...

correct output
1
104870 

user output
1 104870

Test 27

Verdict: ACCEPTED

input
200000 10000
72296 103083
173676 72296
72296 191544
38971 72296
...

correct output
1
1181 

user output
1 1181

Test 28

Verdict: ACCEPTED

input
200000 100000
180193 90285
90285 3229
90285 191578
49699 90285
...

correct output
1
94989 

user output
1 94989

Test 29

Verdict: ACCEPTED

input
200000 5000
149895 27443
149895 63596
162631 149895
77710 149895
...

correct output
3
9962 69107 158765 

user output
3 69107

Test 30

Verdict: ACCEPTED

input
200000 10000
48685 181649
181649 86877
161760 181649
27659 181649
...

correct output
6
33818 96668 107877 151891 1746...

user output
6 33818

Test 31

Verdict: ACCEPTED

input
200000 100000
11743 113918
11743 150916
11743 48160
183097 11743
...

correct output
2
3617 191200 

user output
2 191200

Test 32

Verdict: ACCEPTED

input
200000 10000
99835 74128
188699 111418
188699 179102
88827 164875
...

correct output
93707
2 5 7 8 14 15 16 19 22 25 28 3...

user output
93707 90343

Test 33

Verdict: ACCEPTED

input
200000 10000
185678 126111
144054 64404
93775 80874
96138 119649
...

correct output
2789
41 44 92 148 187 303 372 435 5...

user output
2789 83978

Test 34

Verdict: ACCEPTED

input
200000 10000
96298 24580
141435 60260
62879 70753
62879 53651
...

correct output
93808
3 4 8 9 10 11 12 13 15 17 19 2...

user output
93808 183082

Test 35

Verdict: ACCEPTED

input
200000 10000
66867 107798
69585 26217
142260 2470
170968 66615
...

correct output
4
34912 58399 72540 82303 

user output
4 82303

Test 36

Verdict: ACCEPTED

input
200000 10000
126978 125907
22968 95429
13651 161708
137033 59120
...

correct output
93766
3 7 8 10 13 14 16 18 19 24 25 ...

user output
93766 173415