/ SeriousOJ /

Record Detail

Accepted


  
# Status Time Cost Memory Cost
#1 Accepted 14ms 19.27 MiB
#2 Accepted 15ms 18.707 MiB
#3 Accepted 959ms 32.281 MiB
#4 Accepted 13ms 18.723 MiB
#5 Accepted 10ms 19.062 MiB
#6 Accepted 1205ms 32.391 MiB
#7 Accepted 596ms 32.281 MiB
#8 Accepted 703ms 32.52 MiB
#9 Accepted 1967ms 36.523 MiB
#10 Accepted 1942ms 36.527 MiB
#11 Accepted 1697ms 36.516 MiB
#12 Accepted 1298ms 33.348 MiB
#13 Accepted 637ms 32.199 MiB
#14 Accepted 1695ms 36.445 MiB
#15 Accepted 1941ms 36.52 MiB
#16 Accepted 1882ms 36.512 MiB

Code

// #pragma GCC optimize("Ofast")
// #pragma GCC target("avx2")
#include<bits/stdc++.h>
// #include <ext/pb_ds/assoc_container.hpp>
// #include <ext/pb_ds/tree_policy.hpp>
// using namespace __gnu_pbds;
// #define int long long
#define endl '\n'

using namespace std;
using pii = pair<int, int>;
using tup = tuple<int, int, int>;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
// template <class T> using ordered_set = tree<T, null_type,
//                          less_equal<T>, rb_tree_tag, tree_order_statistics_node_update>;

const int inf = 1e9;
const int mod = 1000000007;
const double eps = 1e-9;
const int N = 200005;

void preprocess() {}

struct Node {
    vector<pii> v;

    Node() {}
    Node(int val) { v = {{1, val}}; }
};

Node merge(Node a, Node &b) {
    for(auto [y, x] : b.v) {
        bool f = 0;
        for(auto &[y2, x2] : a.v) {
            if(x == x2) {
                f = 1;
                y2 += y;
            }
        }
        if(!f) a.v.push_back({y, x});
    }
    sort(a.v.begin(), a.v.end(), greater<pii>());
    while(a.v.size() > 5) a.v.pop_back();
    return a;
}

Node tr[N * 4];
int a[N];

void build(int node, int b, int e) {
    if(b == e) {
        tr[node] = Node(a[b]);
        return;
    }
    int mid = b + e >> 1;
    build(node*2, b, mid);
    build(node*2+1, mid+1, e);

    tr[node] = merge(tr[node*2], tr[node*2+1]);
}

Node query(int node, int b, int e, int i, int j) {
    if(i > e || j < b) return Node();
    if(b >= i && e <= j) return tr[node];

    int mid = b + e >> 1;
    Node left = query(node*2, b, mid, i, j);
    Node right = query(node*2+1, mid+1, e, i, j);

    return merge(left, right);
}


void solve(int tc) {
    int n, q;
    cin >> n >> q;

    for(int i=1; i<=n; i++) cin >> a[i];
    build(1, 1, n);

    while(q--) {
        int l, r;
        cin >> l >> r;
        Node res = query(1, 1, n, l, r);
        int ans = inf;

        for(auto [y, x] : res.v)
            if(y * 3 > r-l+1) ans = min(ans, x);
        if(ans == inf) ans = -1;

        cout << ans << endl;
    }
}

int32_t main() {
    cin.tie(NULL)->sync_with_stdio(false);
    cout.precision(10);

    preprocess();

    int T = 1;
    // cin >> T;

    for (int i = 1; i <= T; i++) {
        solve(i);
    }

    return 0;
}

Information

Submit By
Type
Submission
Problem
P1103 The Secret Garden of Numbers
Language
C++17 (G++ 13.2.0)
Submit At
2025-04-08 20:03:32
Judged At
2025-04-08 20:04:00
Judged By
Score
100
Total Time
1967ms
Peak Memory
36.527 MiB