Submission #365195

#TimeUsernameProblemLanguageResultExecution timeMemory
365195kshitij_sodaniŽarulje (COI15_zarulje)C++14
100 / 100
697 ms53996 KiB
//#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
using namespace std;
typedef long long llo;
#define mp make_pair
#define pb push_back
#define a first 
#define b second
#define endl '\n'
llo n,k;
llo mod=1e9+7;
llo it[200001];
llo dp[2001][2001];


llo le[200001];
llo re[200001];
llo co[200001];
llo cot[200001];
llo cot2[200001];

llo eee(llo aa,llo bb){
	if(bb==0){
		return 1;
	}
	llo ac=eee(aa,bb/2);
	ac=(ac*ac)%mod;
	if(bb%2==1){
		ac=(ac*aa)%mod;
	}
	return ac;
}
llo fac[1000001];
llo fac2[1000001];
vector<pair<llo,llo>> pre[1000001];
llo cal(llo aa,llo bb){
	llo cur=(fac[aa]*fac2[aa-bb])%mod;
	cur=(cur*fac2[bb])%mod;
	return cur;
}
llo pp=1;
llo ans[1000001];
map<llo,llo> ee;
void add(llo x){
	pp=(pp*fac2[ee[x]])%mod;
	ee[x]++;
	pp=(pp*fac[ee[x]])%mod;
}

void rem(llo x){
	pp=(pp*fac2[ee[x]])%mod;
	ee[x]--;
	pp=(pp*fac[ee[x]])%mod;
}

int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin>>n>>k;

	for(llo i=0;i<n;i++){
		cin>>it[i];
	}
	fac[0]=1;
	for(llo i=1;i<=n;i++){
		fac[i]=(fac[i-1]*i)%mod;
		//cout<<fac[i]<<":";
	}
//	cout<<endl;
	for(llo i=n;i<=n;i++){
		fac2[i]=eee(fac[i],mod-2);
		//cout<<fac2[i]<<":";
	}
 
	for(llo i=n-1;i>=0;i--){
		fac2[i]=(fac2[i+1]*(i+1))%mod;
	}
	vector<pair<llo,llo>> ss;
	for(llo i=0;i<n;i++){
		while(ss.size()){
			if(ss.back().a>it[i]){
				ss.pop_back();
			}
			else{
				break;
			}
		}
		le[i]=-1;
		co[i]=1;
		if(ss.size()){
			le[i]=ss.back().b;
			if(ss.back().a==it[i]){
				co[i]+=co[ss.back().b];
			}
			cot[i]=((cot[ss.back().b]*eee(co[i],mod-2))%mod);
			//cot[i]=((cot[i]*fac[co[i]-1])%mod);
		}
		else{
			cot[i]=1;
		}
		ss.pb({it[i],i});
	}
	ss.clear();

	for(llo i=n-1;i>=0;i--){
		while(ss.size()){
			if(ss.back().a>it[i]){
				pre[i].pb(ss.back());
				ss.pop_back();
			}
			else{
				break;
			}
		}
		re[i]=-1;
		co[i]=1;
		if(ss.size()){
			re[i]=ss.back().b;
			if(ss.back().a==it[i]){
				co[i]+=co[ss.back().b];
			}
			cot2[i]=((cot2[ss.back().b]*eee(co[i],mod-2))%mod);
			//cot2[i]=((cot2[i]*fac[co[i]-1])%mod);
		}
		else{
			cot2[i]=1;
		}
		ss.pb({it[i],i});
	}
	vector<pair<llo,llo>> tt;
	for(llo i=0;i<n;i++){
		ee[it[i]]=0;
	}
	
	for(auto j:ss){
		add(j.a);
	}
	vector<pair<llo,llo>> xx;
	/*for(int i=0;i<n;i++){
		cout<<cot[i]<<":";
	}
	cout<<endl;
	for(int i=0;i<n;i++){
		cout<<cot2[i]<<":";
	}
	cout<<endl;
	for(int i=0;i<=n;i++){
		cout<<fac2[i]<<":";
	}
	cout<<endl;*/
	for(llo i=0;i<n;i++){

		rem(ss.back().a);
		ss.pop_back();
		if(pre[i].size()){
			reverse(pre[i].begin(),pre[i].end());
		}	
		for(auto j:pre[i]){
			ss.pb(j);
			add(j.a);
		}

		if(i>0){
			while(xx.size()){
				if(xx.back().a>it[i-1]){
					rem(xx.back().a);
					xx.pop_back();
				}
				else{
					break;
				}
			}
			add(it[i-1]);
			xx.pb({it[i-1],i});
		}
		llo ans2=pp;
		if(i>0){
			ans2=(ans2*cot[i-1])%mod;
		}
		if(i+1<n){
			ans2=(ans2*cot2[i+1])%mod;
		}
		ans[i]=ans2;
	}

	for(llo i=0;i<k;i++){
		llo aa;
		cin>>aa;
		aa--;
		cout<<ans[aa]<<endl;
	}


 
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...