Submission #803053

#TimeUsernameProblemLanguageResultExecution timeMemory
803053Ahmed57Žarulje (COI15_zarulje)C++17
100 / 100
717 ms30760 KiB
#include<bits/stdc++.h>
using namespace std;
//Fast
#define mod 1000000007

long long fact[1000001],inverse[1000001];
long long ans[200001];
long long fast(long long x,long long n)
{
    if (n == 0) {
        return 1;
    }
    long long pow = fast(x, n / 2)%mod;
    if (n & 1) {
        return ((((x%mod) * (pow%mod))%mod) * pow%mod)%mod;
    }
    return ((pow%mod) * (pow%mod))%mod;
}

long long solve(int a,int b){
    return((fact[a]*inverse[b])%mod*inverse[a-b])%mod;
}

pair<int,int> mp[200001];
long long res = 1;
void lol(int x,int i,int j){
    int p1 = mp[x].first;
    int p2 = mp[x].second;
    res *= fast(solve(p1+p2,p1),mod-2);res%=mod;
    if(i==1)p1+=j;
    else p2+=j;
    res *= solve(p1+p2,p1);res%=mod;
    mp[x].first = p1;
    mp[x].second = p2;
}
int main(){
    fact[0] = inverse[0] = fact[1] = inverse[1] = 1;
    for(int i = 2;i<=1e6;i++){
        fact[i]=fact[i-1]*i;
        fact[i]%=mod;
        inverse[i] = fast(fact[i],mod-2);
    }
    int n,m;
    cin>>n>>m;
    int arr[n+1];
    for(int i = 1;i<=n;i++){
        cin>>arr[i];
    }
    vector<int> adj[n+1];
    stack<int> st;
    for(int i = n;i>=1;i--){
        while(st.size()&&arr[i]<arr[st.top()]){
            adj[i].push_back(st.top());st.pop();
        }
        st.push(i);
    }
    while(st.size()){
        adj[1].push_back(st.top());st.pop();
    }
    for(int i = 1;i<=n;i++){
        for(auto j:adj[i]){
            lol(arr[j],1,1);
        }
        lol(arr[i],1,-1);
        ans[i] = res;
        while(st.size()&&arr[i]<arr[st.top()]){
            lol(arr[st.top()],2,-1);st.pop();
        }
        st.push(i);
        lol(arr[i],2,1);
    }
    for(int i = 1;i<=m;i++){
        int e;cin>>e;
        cout<<ans[e]<<endl;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...