Submission #1110152

#TimeUsernameProblemLanguageResultExecution timeMemory
1110152vjudge1Žarulje (COI15_zarulje)C++17
100 / 100
356 ms191816 KiB
#include<bits/stdc++.h> using namespace std; #define int long long #define Ls l.top() #define Rs r.top() #define calc(x) (fac[mp1[x]+mp2[x]]*inv[mp2[x]]%M*inv[mp1[x]]%M) const int M=1e9+7,N=1<<18; int H[N],fac[N],inv[N],res[N],mp1[N],mp2[N]; stack<int>bad[N],l,r; int qp(int x,int k=M-2){ if(!k) return 1; int y=qp(x,k/2); y=y*y%M; if(k&1)y=y*x%M; return y; } signed main(){ l.push(0),r.push(0); cin.tie(0)->sync_with_stdio(0); fac[0]=1; for(int i=1;i<N;i++) fac[i]=fac[i-1]*i%M; inv[N-1]=qp(fac[N-1]); res[1]=1; for(int i=N;--i;) inv[i-1]=inv[i]*i%M; int n,k; cin>>n>>k; for(int i=1;i<=n;i++) cin>>H[i]; for(int i=n;i>1;mp2[H[i]]++,r.push(H[i--])) while(Rs>H[i]) bad[i].push(Rs), mp2[Rs]--,r.pop(); for(int i=2;i<=n;i++) { res[i]=res[i-1]; while(Ls>H[i-1]) res[i]=res[i]*qp(calc(Ls))%M, mp1[Ls]--,res[i]=res[i]*calc(Ls)%M,l.pop(); res[i]=res[i]*qp(calc(Rs))%M,mp2[Rs]--; res[i]=res[i]*calc(Rs)%M,r.pop(); l.push(H[i-1]),res[i]=res[i]*qp(calc(Ls))%M; mp1[Ls]++,res[i]=res[i]*calc(Ls)%M; while(bad[i].size()) r.push(bad[i].top()),res[i]=res[i]*qp(calc(Rs))%M, mp2[Rs]++,res[i]=res[i]*calc(Rs)%M,bad[i].pop(); } while(k--){ int x; cin>>x; cout<<res[x]<<'\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...