Submission #1320449

#TimeUsernameProblemLanguageResultExecution timeMemory
1320449BolatuluGift Exchange (JOI24_ho_t4)C++20
0 / 100
33 ms47472 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef long double db;

// #define int ll
#define all(x) (x).begin(), (x).end()
#define md ((tl + tr) >> 1)
#define TL v + v, tl, md
#define TR v + v + 1, md + 1, tr

constexpr int maxn = 1'000'007;
constexpr ll inf = 1e18 + 7;
constexpr ll M = 1e9 + 7;

int binpow(int a, int n) {
    if (n == 0)
        return 1;
    if (n & 1)
        return a * binpow(a, n - 1) % M;
    int x = binpow(a, n >> 1);
    return x * x % M;
}

const int dx[4] = {-1, 0, 1, 0};
const int dy[4] = {0, 1, 0, -1};
const db eps = 0.00000000001;

mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

int random(int l, int r) {
    return uniform_int_distribution<int>(l, r)(rng);
}

int n, a[maxn], b[maxn], q, ans[maxn], L[maxn], R[maxn], t[4 * maxn];
vector<pair<int, int>> d[maxn];
vector<int> u[maxn];
set<int> s[maxn];

void upd(int p, int x, bool tp, int v = 1, int tl = 1, int tr = 2 * n) {
    if (tl == tr) {
        if (tp)
            s[tl].insert(x);
        else
            s[tl].erase(x);
        if (s[tl].empty())
            t[v] = inf;
        else
            t[v] = *s[tl].begin();
        return;
    }
    if (p <= md)
        upd(p, x, tp, TL);
    else
        upd(p, x, tp, TR);
    t[v] = min(t[v + v], t[v + v + 1]);
}

int get(int l, int r, int v = 1, int tl = 1, int tr = 2 * n) {
    if (tl >= l && tr <= r) {
        return t[v];
    }
    if (tl > r || l > tr) {
        return inf;
    }
    return min(get(l, r, TL), get(l, r, TR));
}

void solve() {
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int i = 1; i <= n; i++)
        cin >> b[i];

    vector<int> v;
    for (int i = 1; i <= n; i++) {
        while (!v.empty() && b[i] > b[v.back()])
            v.pop_back();
        v.push_back(i);
        
        int l = -1, r = v.size();
        while (l + 1 < r) {
            int mid = (l + r) / 2;
            if (a[i] > b[v[mid]])
                r = mid;
            else
                l = mid;
        }
        if (l == -1)
            L[i] = 1;
        else
            L[i] = v[l] + 1;
    }

    v.clear();
    for (int i = n; i >= 1; i--) {
        while (!v.empty() && b[i] > b[v.back()])
            v.pop_back();
        v.push_back(i);
        
        int l = -1, r = v.size();
        while (l + 1 < r) {
            int mid = (l + r) / 2;
            if (a[i] > b[v[mid]])
                r = mid;
            else
                l = mid;
        }
        if (l == -1)
            R[i] = 1;
        else
            R[i] = v[l] - 1;
    }

    for (int i = 1; i <= n; i++) {
        u[L[i]].push_back(b[i]);
        u[R[i] + 1].push_back(-b[i]);
    }
    
    cin >> q;
    for (int i = 1; i <= q; i++) {
        int l, r;
        cin >> l >> r;
        d[r].emplace_back(l, i);
    }

    for (int i = 1; i <= n; i++) {
        for (auto x : u[i]) {
            if (x > 0) {
                upd(i, x, 1);
            } else {
                upd(i, x, 0);
            }
        }
        for (auto [l, i] : d[i]) {
            ans[i] = get(1, i);
        }
    }
    for (int i = 1; i <= q; i++) {
        cout << ans[i] << '\n';
    }
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int test = 1;
    // cin >> test;
    while (test--) {
        solve();
        // cout << '\n';
    }
    return 0;
}

Compilation message (stderr)

Main.cpp: In function 'void upd(int, int, bool, int, int, int)':
Main.cpp:49:20: warning: overflow in conversion from 'll' {aka 'long long int'} to 'int' changes value from '1000000000000000000' to '-1486618624' [-Woverflow]
   49 |             t[v] = inf;
      |                    ^~~
Main.cpp: In function 'int get(int, int, int, int, int)':
Main.cpp:66:16: warning: overflow in conversion from 'll' {aka 'long long int'} to 'int' changes value from '1000000000000000000' to '-1486618624' [-Woverflow]
   66 |         return inf;
      |                ^~~
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...