-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathguessgreat.cpp
102 lines (82 loc) · 2.15 KB
/
guessgreat.cpp
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
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
ll s_mx_all = 0;
ll query(ll l, ll r) {
if(l == r) return s_mx_all;
ll s_mx_ind = 0;
cout << "? " << l << " " << r << endl;
cout.flush();
cin >> s_mx_ind;
return s_mx_ind;
}
int main(int argc, char const *argv[]) {
ll n;
cin >> n;
ll l = 1;
ll r = n;
s_mx_all = query(l, r);
// For size 2
if(n == 2) {
if(s_mx_all == 1) {
cout << "! 2" << endl;
} else {
cout << "! 1" << endl;
}
return 0;
}
// Check which side max is on
// Right side
if(s_mx_all == 1) {
ll lo = s_mx_all + 1;
ll hi = n;
while(lo < hi) {
ll mid = (lo + hi + 1) / 2;
if(query(s_mx_all, mid) == s_mx_all) {
hi = mid - 1;
} else {
lo = mid;
}
}
if(query(s_mx_all, hi) == s_mx_all) cout << "! " << hi << endl;
else cout << "! " << hi + 1 << endl;
} else if(s_mx_all == n) {
ll lo = 1;
ll hi = s_mx_all - 1;
while(lo < hi) {
ll mid = (lo + hi + 1) / 2;
if(query(mid, s_mx_all) == s_mx_all) {
lo = mid;
} else {
hi = mid - 1;
}
}
cout << "! " << lo << endl;
} else if(query(s_mx_all, r) == s_mx_all) {
ll lo = s_mx_all + 1;
ll hi = n;
while(lo < hi) {
ll mid = (lo + hi + 1) / 2;
if(query(s_mx_all, mid) == s_mx_all) {
hi = mid - 1;
} else {
lo = mid;
}
}
if(query(s_mx_all, hi) == s_mx_all) cout << "! " << hi << endl;
else cout << "! " << hi + 1 << endl;
} else {
ll lo = 1;
ll hi = s_mx_all - 1;
while(lo < hi) {
ll mid = (lo + hi + 1) / 2;
if(query(mid, s_mx_all) == s_mx_all) {
lo = mid;
} else {
hi = mid - 1;
}
}
cout << "! " << lo << endl;
}
return 0;
}