제출 #1330854

#제출 시각아이디문제언어결과실행 시간메모리
1330854miminyteWorm Worries (BOI18_worm)C++20
10 / 100
2 ms4168 KiB
#include <iostream>
#include <vector>
#include <map>

using namespace std;

vector <int> v;
int q;

int ask(int i) {
    if(q == 0) {
        cout << "NOQUERIESLEFT" << endl;
        exit(0);
    }
    q--;

    cout << "? " << i+1 << " 1 1" << endl;
    cin >> v[i];
    return v[i];
}

int main() {
    int n, m, k;

    cin >> n >> m >> k >> q;

    v.resize(n, -1);

    int l = 0, r = n - 1, mid;

    int a = n/3, b = 2*n/3;

    ask(a);
    ask(b);

    if(v[a] < v[b]) {
        l = a;
        mid = b;
    } else {
        r = b;
        mid = a;
    }

    int curr;

    while(r - mid > 1 || mid - l > 1) {
        if(r - mid > mid - l) {
            curr = (mid + r) / 2;
            ask(curr);
            if(v[curr] < v[mid]) {
                r = curr;
            } else {
                l = mid;
                mid = curr;
            }
        }
        else {
            curr = (mid + l) / 2;
            ask(curr);
            if(v[curr] < v[mid]) {
                l = curr;
            } else {
                r = mid;
                mid = curr;
            }
        }
    }

    if(mid > 0 && v[mid-1] == -1) {
        ask(mid-1);
    }

    if(mid < n-1 && v[mid+1] == -1) {
        ask(mid+1);
    }

    if(v[mid] >= v[mid-1] && v[mid] >= v[mid+1]) {
        cout << "! " << mid + 1 << " 1 1" << endl;
    } else if(v[mid-1] >= v[mid]) {
        cout << "! " << mid - 1 + 1 << " 1 1" << endl;
    } else {
        cout << "! " << mid + 1 + 1 << " 1 1" << endl;
    }

    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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...