Submission #1190235

#TimeUsernameProblemLanguageResultExecution timeMemory
1190235jasonicHorses (IOI15_horses)C++20
100 / 100
179 ms91460 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define fastIO cin.tie(0); ios::sync_with_stdio(false)
const ll MOD = 1000000007;

ll x[500005];
ll y[500005];

struct ST{
    double v, rv;
    ll rprod, ans;
    ST *lt, *rt;
    ll l, r;

    void comb() {
        rv = lt->rv + rt->rv;
        rprod = ((lt->rprod * rt->rprod) % MOD + MOD) % MOD;
        if(lt->v > lt->rv + rt->v) {
            v = lt->v;
            ans = lt->ans;
        } else {
            v = lt->rv + rt->v;
            ans = ((lt->rprod * rt->ans) % MOD + MOD) % MOD;
        }
    }

    ST() {
        l = r = -1;
        v = rv = double(0.0);
        lt = rt = nullptr;
        rprod = ans = 0;
    }

    ST(int bl, int br) {
        l = bl; r = br;
        v = rv = double(0.0);
        lt = rt = nullptr;

        if(l == r) {
            rprod = x[l];
            ans = ((x[l] * y[l]) % MOD + MOD) % MOD;
            rv = log10(rprod), v = rv + log10(y[l]);
        } else {
            int m = (l+r)/2;
            lt = new ST(l, m);
            rt = new ST(m+1, r);
            comb();
        }
    }

    void update(int i) {
        if(i < l || r < i) return;
        if(l == r && r == i) {
            rprod = x[l];
            ans = ((x[l] * y[l]) % MOD + MOD) % MOD;
            rv = log10(rprod), v = rv + log10(y[l]);
        } else {
            lt->update(i);
            rt->update(i);
            comb();
        }
    }
};

ST tree;

ll init(int N, int X[], int Y[]) {
    for(int i = 0; i < N; i++) x[i] = X[i];
    for(int i = 0; i < N; i++) y[i] = Y[i];
    // annoying

    tree = ST(0, N-1);

    return tree.ans;
}

ll updateX(int i, int v) {
    x[i] = v;
    tree.update(i);
    
    return tree.ans;
}

ll updateY(int i, int v) {
    y[i] = v;
    tree.update(i);

    return tree.ans;
}
#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...