Submission #1150815

#TimeUsernameProblemLanguageResultExecution timeMemory
1150815fryingducZagrade (COI20_zagrade)C++20
100 / 100
237 ms1048 KiB
#include "bits/stdc++.h"
using namespace std;

#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif

const int maxn = 1e5 + 5;
int n, q;
int cnt_asks;
string s;

int ask(int l, int r) {
  ++l, ++r;
  ++cnt_asks;
  #ifdef duc_debug
  stack<int> st;
  for (int i = l; i <= r; ++i) {
    if (s[i] == ')') {
      if (st.empty()) return 0;
      st.pop();
    } else {
      st.push(i);
    }
  }
  return st.empty();
  #else
  cout << "? " << l << " " << r << endl;
  int x; cin >> x;
  return x;
  #endif
}

void answer(string res) {
  #ifdef duc_debug
  res = ' ' + res;
  if (res != s) {
    cout << "WA";
    assert(0);
  } else {
    if (cnt_asks > q) {
      cout << "too many calls " << cnt_asks << endl;
      assert(0);
    }
    cout << cnt_asks << endl;
  }
  #else
  cout << "! " << res << endl;
  #endif
}

void solve() {
  #ifdef duc_debug
    cin >> n >> q >> s;
    s = ' ' + s;
  #else
    cin >> n >> q;
  #endif
  
  stack<int> st;
  string res;
  for (int i = 1; i <= n; ++i) {
    res += '?';
  }
  st.push(0);
  for (int i = 1; i < n; ++i) {
    if (st.empty()) {
      st.push(i);
      continue;
    } else {
      int t = st.top();
      if (ask(t, i)) {
        res[t] = '(', res[i] = ')';
        st.pop();
      } else {
        st.push(i);
      }
    }
  }
  int cnt = 0;
  for (int i = 0; i < n; ++i) {
    if (res[i] != '?') continue;
    ++cnt;
    if (cnt <= (int)st.size() / 2) {
      res[i] = ')';
    } else {
      res[i] = '(';
    }
  }
  answer(res);
}

signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  solve();

  return 0;
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...