Submission #1351075

#TimeUsernameProblemLanguageResultExecution timeMemory
1351075top1svtinIndex (COCI21_index)C++17
110 / 110
314 ms24328 KiB
#include <bits/stdc++.h>

#define kien long long
#define pb push_back
#define FOR(i, a, b) for (int i = a;i <= b; i++)
#define FORD(i, a, b) for (int i = a;i >= b; i--)
#define task "a"
#define fin(x) freopen(x".inp","r",stdin)
#define fou(x) freopen(x".out","w",stdout)
#define pii pair <int, int>

using namespace std;
//const int LOG = 18;
const int mxn = 2e5 + 5;
kien n, lb[mxn], rb[mxn], ans[mxn], l[mxn], r[mxn];
vector <int> vec[mxn];
pii a[mxn];

struct FenwickTree {
    int N;
    kien bit[mxn];

    void init(int n) {
        N = n;
        for (int i = 1; i <= N; i++) bit[i] = 0;
    }

    void update(int pos, int val) {
        for (; pos <= N; pos += pos & -pos) bit[pos] += val;
    }

    kien get(int pos) {
        kien s = 0;
        for (; pos > 0; pos -= pos & -pos) s += bit[pos];
        return s;
    }

    void update_range(int u, int v, int val) {
        update(u, val);
        update(v + 1, -val);
    }
} BIT;

main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    if (fopen(task".inp", "r")) {
        fin(task); fou(task);
    }
    kien q;
    cin >> n >> q;
    FOR (i, 1, n) cin >> a[i].first, a[i].second = i;
    sort (a + 1, a + 1 + n);

    FOR (i, 1, q) {
        cin >> l[i] >> r[i];
        lb[i] = 1, rb[i] = r[i] - l[i] + 1;
    }

    /// log. q + log. n. log + n. log
    int LOG = 19;
    while (LOG--) {
        vector <int> datas;
        FOR (i, 1, q) {
            if (lb[i] > rb[i]) continue;
            int mid = (lb[i] + rb[i]) >> 1;
            if (vec[mid].empty()) datas.pb(mid);
            vec[mid].pb(i);
        }
        sort (datas.begin(), datas.end(), greater<int>());

        int i = n;
        BIT.init(n + 1);
        for (auto x : datas) {
            while (a[i].first >= x and i >= 1) {
                BIT.update(a[i].second, 1);
                i--;
            }

            for (auto v : vec[x]) {
//                cout <<
//                if (v == 6) cout << BIT.get(r[v]) - BIT.get(l[v] - 1) << " " << x << "\n";
                if (BIT.get(r[v]) - BIT.get(l[v] - 1) >= x) {
                    lb[v] = x + 1;
                    ans[v] = x;
                }
                else rb[v] = x - 1;
            }
            vec[x].clear();
        }

    }

    FOR (i, 1, q) cout << ans[i] << "\n";
}

Compilation message (stderr)

index.cpp:44:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
   44 | main() {
      | ^~~~
index.cpp: In function 'int main()':
index.cpp:8:23: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    8 | #define fin(x) freopen(x".inp","r",stdin)
      |                ~~~~~~~^~~~~~~~~~~~~~~~~~~
index.cpp:48:9: note: in expansion of macro 'fin'
   48 |         fin(task); fou(task);
      |         ^~~
index.cpp:9:23: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
    9 | #define fou(x) freopen(x".out","w",stdout)
      |                ~~~~~~~^~~~~~~~~~~~~~~~~~~~
index.cpp:48:20: note: in expansion of macro 'fou'
   48 |         fin(task); fou(task);
      |                    ^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...