제출 #641964

#제출 시각아이디문제언어결과실행 시간메모리
641964andecaandeciZagrade (COI20_zagrade)C++17
100 / 100
886 ms708 KiB
#include <bits/stdc++.h>
using namespace std;

int n, q;
char arr[100005];

int ask(int l, int r) {
    cout << "? " << l <<  " "  << r << endl;
    int ret;
    cin >> ret;
    return ret;
}

int main() {
    cin >> n >> q;
    int sz = -1;

    for(int i =1 ; i <= n;i++) {
        arr[i] = '.';
    }
    vector<pair<int, int> > v;
    int l = 1, r = 2;
    while(r <= n) {
        int ret = ask(l, r);
        if (ret) {
            arr[l] = '(';
            arr[r] = ')';
            // if (sz >= 0) {
            //   cout << v[sz].second << " " << l << endl;
            // }
            while (sz >= 0 && v[sz].second >= l - 1) {
                // cout << v[sz].second << " " << l - 1 << endl;
                // cout << v[sz].first << " " << v[sz].second << endl;
                l = min(l, v[sz].first);
                r = max(r, v[sz].second);
                v.pop_back();
                sz--;
            }
            
            // cout << ":: v nya ::" << endl; 
            
            // for(int j = 0; j < v.size(); j++) {
            //   cout << v[j].first << " " << v[j].second  << " ";
            // }
            
            // cout << "l r" << endl;
            
            // cout << l << " " << r << endl;
            sz++;
            v.push_back(make_pair(l, r));
            
            // cout << "::" << v.size() << endl;
            
            

            if (sz >= 1) {
                r++;
                l--;
            }
            else if(l > 1) {
              r++;
              l--;
            }
            else {
                r+=2;
                l = r - 1;
            }

            
        }
        else {
            r++;
            l = r - 1;
        }
    }
    int tot = 0;
    for(int i = 1; i <= n; i++) {
        if (arr[i] == '.') {
            tot++;
        }
    }

    tot /= 2;

    cout << "! ";

    int cnt = 0;

    for(int i = 1; i <= n; i++) {
        if (arr[i] == '.') {
            if (cnt < tot) {
                cout << ')';
            }
            else {
                cout << '(';
            }
            cnt++;
            continue;
        }
        cout << arr[i];
    }
    cout << endl;

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