結果

問題 No.2978 Lexicographically Smallest and Largest Subarray
ユーザー V_Melville
提出日時 2024-12-03 16:34:28
言語 C++23
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 200 ms / 2,000 ms
コード長 1,183 bytes
コンパイル時間 3,203 ms
コンパイル使用メモリ 247,508 KB
実行使用メモリ 25,460 KB
平均クエリ数 1499.00
最終ジャッジ日時 2024-12-03 16:34:45
合計ジャッジ時間 16,646 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 57
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)

using namespace std;

int get(int l1, int r1, int l2, int r2) {
    cout << "? " << l1 << ' ' << r1 << ' ' << l2 << ' ' << r2 << '\n';
    int res;
    cin >> res;
    return res;
}

int main() {
    int n, q;
    cin >> n >> q;
    
    vector<int> small, large;
    for (int i = 1; i <= n; i += 2) {
        int x = get(i, n, i+1, n);
        if (x == 1) {
            small.push_back(i);
            large.push_back(i+1);
        }
        else if (x == 0) {
            small.push_back(i+1);
            large.push_back(i);
        }
        else return 0;
    }
    
    int smallest = small[0];
    for (int i = 1; i < small.size(); ++i) {
        int x = get(small[i], small[i], smallest, smallest);
        if (x == 1) smallest = small[i];
        else if (x == -1) return 0;
    }
    
    int largest = large[0];
    for (int i = 1; i < large.size(); ++i) {
        int x = get(largest, n, large[i], n);
        if (x == 1) largest = large[i];
        else if (x == -1) return 0;
    }
    
    cout << "! " << smallest << ' ' << smallest << ' ' << largest << ' ' << n << '\n';
     
    return 0;
}
0