Pagini recente » Borderou de evaluare (job #1368045) | Cod sursa (job #605446) | Cod sursa (job #2073382) | Statistici Alladin (Audita) | Cod sursa (job #1267695)
#include <cstdio>
#include <algorithm>
#define Nmax 1050000
using namespace std;
struct el
{
int val,poz;
bool operator <(const el &A) const
{
return val<A.val;
}
};
el v[Nmax];
int n,a[Nmax],frj[Nmax],frk[Nmax],cntj,cntk;
inline void Normalize()
{
int i;
sort(v+1,v+n+1);
a[v[1].poz]=1;
for(i=2;i<=n;++i)
if(v[i].val==v[i-1].val)
a[v[i].poz]=a[v[i-1].poz];
else
a[v[i].poz]=a[v[i-1].poz]+1;
}
inline bool Ok(int p)
{
if(frj[a[p]]==1) return false;
return true;
}
int main()
{
int L,U,i,j,k;
long long sol=0;
freopen ("secv5.in","r",stdin);
freopen ("secv5.out","w",stdout);
scanf("%d%d%d", &n,&L,&U);
for(i=1;i<=n;++i)
{
scanf("%d", &v[i].val);
v[i].poz=i;
}
Normalize();
for(i=j=k=1;i<=n;++i)
{
if(++frj[a[i]]==1) ++cntj;
if(++frk[a[i]]==1) ++cntk;
while(j<i && ((cntj==L && Ok(j)) || cntj==L+1))
{
--frj[a[j]];
if(frj[a[j]]==0) --cntj;
++j;
}
while(k<i && cntk==U+1)
{
--frk[a[k]];
if(frk[a[k]]==0) --cntk;
++k;
}
//printf("%d %d\n", j,k);
if(cntj>=L && cntk<=U)
sol+=(j-k+1);
}
printf("%lld\n", sol);
return 0;
}