提交时间:2024-05-06 19:04:09
运行 ID: 29350
#include<bits/stdc++.h> #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define p_b push_back #define m_p make_pair #define pi pair<int,int> #define p1 first #define p2 second using namespace std; typedef long long ll; const int maxn=1e5+10,mod=1e9+7; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; }int n,m,L,R,P[maxn],used[maxn]; vector<int>pos,S; vector<int>mp[maxn],mp2[maxn]; struct BIT { int t[505]; void cl(){memset(t,0,sizeof(t));} int lb(int x){return x&(-x);} void upd(int x,int v){for(;x<=n;x+=lb(x))t[x]+=v;} int qry(int x){int res=0;for(;x;x-=lb(x))res+=t[x];return res;} }T; void dfs(int x,int pos,int st,int now){ if(x>m/2){ mp[st].p_b(now);return; }if(P[pos]){T.upd(P[pos],1);dfs(x,pos+1,st,now+pos-T.qry(P[pos]));T.upd(P[pos],-1);return;} int ii=0; for(int y:S){ if(!used[y]){ used[y]=1;T.upd(y,1); dfs(x+1,pos+1,st|(1<<ii),now+pos-T.qry(y)); T.upd(y,-1);used[y]=0; } ++ii; } } void dfs2(int x,int pos,int st,int now){ if(pos>n){ mp2[st].p_b(now);return; }if(P[pos]){T.upd(P[pos],1);dfs2(x,pos+1,st,now+T.qry(n)-T.qry(P[pos]));T.upd(P[pos],-1);return;} int ii=0; for(int y:S){ if(!used[y]){ used[y]=1;T.upd(y,1); dfs2(x+1,pos+1,st|(1<<ii),now+T.qry(n)-T.qry(y)); T.upd(y,-1);used[y]=0; } ++ii; } } int calc(int St){ T.cl(); int res=0; vector<int>S1,S2; up(i,1,pos[m/2])if(P[i])T.upd(P[i],1); down(i,m-1,0)if((St>>i)&1)T.upd(S[i],1); up(i,pos[m/2]+1,n)if(P[i])res+=T.qry(n)-T.qry(P[i]); down(i,m-1,0)if(!((St>>i)&1))res+=T.qry(n)-T.qry(S[i]); return res; } ll sol(int x){ if(x==-1)return 0; ll res=0;int S=(1<<m)-1; up(i,0,(1<<m)-1){ int val=calc(i); for(int y:mp[i])res+=upper_bound(mp2[S^i].begin(),mp2[S^i].end(),x-y-val)-mp2[S^i].begin(); } return res; } void slv(){ n=read(),L=read(),R=read();up(i,1,n)P[i]=read(),used[P[i]]=1; pos.p_b(0);up(i,1,n)if(!P[i])pos.p_b(i); up(i,1,n)if(!used[i])S.p_b(i),++m; dfs(1,1,0,0),dfs2(m/2+1,pos[m/2]+1,0,0); up(i,0,(1<<m)-1)sort(mp[i].begin(),mp[i].end()),sort(mp2[i].begin(),mp2[i].end()); ll res=(sol(R)-sol(L-1)+mod)%mod; cout<<res; }int main(){ slv(); return 0; }