Submission #1330874

#TimeUsernameProblemLanguageResultExecution timeMemory
1330874miminyteWorm Worries (BOI18_worm)C++20
10 / 100
2 ms4252 KiB
#include <iostream>
#include <vector>
#include <map>

using namespace std;

vector <int> v;
int q;
int l, r, mid;

int gr_left(int a, int b) {
    cerr << "Calculating gr_left with a: " << a << ", b: " << b << endl;
    return int(0.382 * (b - a)) + a;
}

int gr_right(int a, int b) {
    cerr << "Calculating gr_right with a: " << a << ", b: " << b << endl;
    return int(0.618 * (b - a)) + a;
}

int ask(int i) {
    if(v[i] != -1) {
        cerr << "Value already known for index: " << i << ", value: " << v[i] << endl;
        return v[i];
    }

    cerr << "l: " << l << ", mid: " << mid << ", r: " << r << ", asking for index: " << i << endl;
    if(q == 0) {
        cout << r-mid << ' ' << mid-l << 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);

    l = 0;
    r = n - 1;

    int a, b;
    a = gr_left(0, n-1);
    b = gr_right(0, n-1);
    if(a == b) {
        b++;
    }

    ask(a);
    ask(b);

    bool next_right = false;

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

    int curr;

    while(r - mid > 1 || mid - l > 1 && r - l > 2) {
        if(next_right) {
            curr = gr_right(l, r);
            ask(curr);
            if(v[curr] > v[mid]) {
                l = mid;
                mid = curr;
                next_right = true;
            } else {
                r = curr;
                next_right = false;
            }
        } else {
            curr = gr_left(l, mid);
            ask(curr);
            if(v[curr] > v[mid]) {
                r = mid;
                mid = curr;
                next_right = false;
            } else {
                l = curr;
                next_right = true;
            }
        }
    }

    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]) {
        ask(mid-2);
        if(v[mid-2] <= v[mid-1]) {
            cout << "! " << mid - 1 + 1 << " 1 1" << endl;
        } else {
            cout << "! " << mid - 2 + 1 << " 1 1" << endl;
        }
    } else {
        ask(mid+2);
        if(v[mid+2] <= v[mid+1]) {
            cout << "! " << mid + 1 + 1 << " 1 1" << endl;
        } else {
            cout << "! " << mid + 2 + 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...