Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define ll long long
- #define db long double
- #define x first
- #define y second
- #define mp make_pair
- #define pb push_back
- #define all(a) a.begin(), a.end()
- using namespace std;
- int n;
- char ask(int a, int b) {
- cout << "? " << a << ' ' << b << endl;
- char c;
- cin >> c;
- return c;
- }
- int main(){
- cin >> n;
- vector<int> t;
- char c = ask(1, 2);
- t.pb(1);
- t.pb(2);
- int last = 3;
- int uk = 0;
- while (last <= n) {
- int new_node = last++;
- if (uk == 0) {
- auto new_c = ask(t.back(), new_node);
- if (new_c == c) {
- t.pb(new_node);
- continue;
- } else {
- uk = (int)t.size() - 1;
- t.pb(new_node);
- continue;
- }
- }
- auto new_c = ask(t[uk], new_node);
- if (new_c == c) {
- int uk2;
- auto sec_c = ask(t.back(), new_node);
- vector<int> d;
- for (int i = 0; i < uk; ++i) d.pb(t[i]);
- d.pb(new_node);
- if (sec_c == c) {
- uk2 = d.size();
- } else {
- uk2 = (int)d.size() - 1;
- }
- for (int i = (int)t.size() - 1; i >= uk; --i) d.pb(t[i]);
- uk = uk2;
- t = d;
- } else {
- auto sec_c = ask(t[uk - 1], t.back());
- vector<int> d;
- for (int i = 0; i < uk; ++i) d.pb(t[i]);
- for (int i = (int)t.size() - 1; i >= uk; --i) d.pb(t[i]);
- d.pb(new_node);
- if (sec_c == c) {
- uk = uk;
- } else {
- uk = uk - 1;
- }
- t = d;
- }
- }
- cout << "! ";
- for (int x : t) cout << x << ' ';
- cout << endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement