-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathABC355E.cpp
43 lines (43 loc) · 1.27 KB
/
ABC355E.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
#include <bits/extc++.h>
using namespace std;
namespace pbds = __gnu_pbds;
using ui = unsigned int;
using uli = unsigned long long int;
using li = long long int;
struct question {
ui i, j;
question(void): i(~0), j(~0) {}
question(ui _i, ui _j): i(_i), j(_j) {}
};
int main(void) {
ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
ui n, l, r;
cin >> n >> l >> r;
++r;
queue<size_t> q({l});
vector<size_t> from((1 << n) + 1, ~0);
vector<question> t((1 << n) + 1);
while (!q.empty()) {
ui p = q.front();
q.pop();
for (ui j = 0; (p & ((1u << j) - 1)) == 0 && j <= n; ++j) {
if (p + (1u << j) <= (1u << n) && p + (1u << j) != l &&
!~from[p + (1u << j)])
t[p + (1u << j)] = {j, p / (1u << j)}, from[p + (1u << j)] = p,
q.push(p + (1u << j));
if (p - (1u << j) <= (1u << n) && p - (1u << j) != l &&
!~from[p - (1u << j)])
t[p - (1u << j)] = {j, p / (1u << j) - 1}, from[p - (1u << j)] = p,
q.push(p - (1u << j));
}
}
ui sum = 0;
for (size_t i = r; i != l; i = from[i]) {
cout << "? " << t[i].i << ' ' << t[i].j << endl;
ui x;
cin >> x;
(sum += 100 + ((1 << t[i].i) * t[i].j != i ? x : -x)) %= 100;
}
cout << "! " << sum;
return 0;
}