Submission #227187

#TimeUsernameProblemLanguageResultExecution timeMemory
227187dolphingarlicŽarulje (COI15_zarulje)C++14
100 / 100
159 ms26232 KiB
#include <bits/stdc++.h>
#define FOR(i, x, y) for (int i = x; i < y; i++)
typedef long long ll;
using namespace std;

const ll MOD = 1e9 + 7;

const ll mult(const ll &A, const ll &B) { return (A * B) % MOD; }

int a[200002], l_cnt[200002], r_cnt[200002];
ll fact[200002]{1}, inv_fact[200002]{1}, ans[200002]{1};
vector<int> l_ers[200002], r_ers[200002];

const ll choose(const ll &A, const ll &B) { return mult(mult(fact[A], inv_fact[B]), inv_fact[A - B]); }

const ll inv_choose(const ll &A, const ll &B) { return mult(mult(inv_fact[A], fact[B]), fact[A - B]); }

ll expo(ll A, ll B) {
    ll ans = 1;
    while (B) {
        if (B & 1) ans = mult(ans, A);
        A = mult(A, A);
        B >>= 1;
    }
    return ans;
}

void update(int pos, int val, bool l, bool add) {
    ans[pos] = mult(ans[pos], inv_choose(l_cnt[val] + r_cnt[val], l_cnt[val]));
    if (l) {
        if (add) l_cnt[val]++;
        else l_cnt[val]--;
    } else {
        if (add) r_cnt[val]++;
        else r_cnt[val]--;
    }
    ans[pos] = mult(ans[pos], choose(l_cnt[val] + r_cnt[val], l_cnt[val]));
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    int n, k;
    cin >> n >> k;
    FOR(i, 1, n + 1) {
        cin >> a[i];
        fact[i] = mult(fact[i - 1], i);
        inv_fact[i] = expo(fact[i], MOD - 2);
    }
    
    stack<int> stck;
    FOR(i, 1, n + 1) {
        while (stck.size() && stck.top() > a[i]) {
            l_ers[i].push_back(stck.top());
            stck.pop();
        }
        stck.push(a[i]);
    }
    while (stck.size()) stck.pop();
    for (int i = n; i; i--) {
        while (stck.size() && stck.top() > a[i]) {
            r_ers[i].push_back(stck.top());
            r_cnt[stck.top()]--;
            stck.pop();
        }
        stck.push(a[i]);
        r_cnt[a[i]]++;
    }

    FOR(i, 1, n + 1) {
        ans[i] = ans[i - 1];
        if (i > 1) {
            update(i, a[i - 1], 1, 1);
            for (int j : l_ers[i - 1]) update(i, j, 1, 0);
        }
        update(i, a[i], 0, 0);
        for (int j : r_ers[i]) update(i, j, 0, 1);
    }

    while (k--) {
        int pos;
        cin >> pos;
        cout << ans[pos] << '\n';
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...