Submission #1225427

#TimeUsernameProblemLanguageResultExecution timeMemory
1225427Hamed_GhaffariHorses (IOI15_horses)C++20
100 / 100
512 ms36840 KiB
#include <bits/stdc++.h>
using namespace std;

#define lc id<<1
#define rc lc|1
#define mid ((l+r)>>1)

const int MXN = 5e5+5, MOD = 1e9+7;

inline int power(int a, int b) {
    int res = 1;
    while(b) {
        if(b&1) res = 1ll*res*a%MOD;
        a = 1ll*a*a%MOD;
        b >>= 1;
    }
    return res;
}

int n, X[MXN], Y[MXN], tot, seg[MXN<<2];
void upd(int p, int l=0, int r=n, int id=1) {
    if(r-l == 1) {
        seg[id] = Y[p];
        return;
    }
    p<mid ? upd(p, l, mid, lc) : upd(p, mid, r, rc);
    seg[id] = max(seg[lc], seg[rc]);
}
int get(int s, int e, int l=0, int r=n, int id=1) {
    if(s>=r || l>=e) return 0;
    if(s<=l && r<=e) return seg[id];
    return max(get(s, e, l, mid, lc), get(s, e, mid, r, rc));
}

set<int> st;

inline int get() {
    int A=1, B=1, cur=1, tmp;
    if(st.empty()) A = seg[1];
    else {
        A = get(*st.rbegin(), n);
        auto it = prev(st.end());
        while(1) {
            if((*it)==0) break;
            if(1ll*cur*X[*it]>=MOD) break;
            cur *= X[*it];
            tmp = it==st.begin() ? get(0, *it) : get(*prev(it), *it);
            if(1ll*A*cur < 1ll*B*tmp)
                A = tmp, B = cur; 
            if(it==st.begin()) break;
            it = prev(it);
        }
    }
    return 1ll*tot*A%MOD*power(B, MOD-2)%MOD;
}

int init(int N, int X[], int Y[]) {
    n = N;
    tot = 1;
    for(int i=0; i<n; i++) {
        ::X[i] = X[i];
        ::Y[i] = Y[i];
        upd(i);
        if(X[i]>1) st.insert(i);
        tot = 1ll*tot*X[i]%MOD;
    }
    return get();
}

int updateX(int pos, int val) {
    st.erase(pos);
    tot = 1ll*tot*power(X[pos], MOD-2)%MOD;
    X[pos] = val;
    if(X[pos]>1) st.insert(pos);
    tot = 1ll*tot*val%MOD;
    return get();
}

int updateY(int pos, int val) {
    Y[pos] = val;
    upd(pos);
    return get();
}
#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...