Pagini recente » Cod sursa (job #1980569) | Cod sursa (job #1998346) | Cod sursa (job #993259) | Cod sursa (job #3257054) | Cod sursa (job #993631)
Cod sursa(job #993631)
#include <fstream>
#include <cstdio>
#include <algorithm>
using namespace std;
int n,p,u;
int a[1050000];
int fr1[1050000],fr2[1050000];
long long sol;
struct str
{
int val, poz;
};
str v[1050000];
inline bool cmp(const str A, const str B)
{
return A.val < B.val;
}
void Citire()
{
freopen ("secv5.in", "r", stdin);
int i;
scanf ("%d %d %d", &n, &p, &u);
for(i=1;i<=n;i++)
{
scanf("%d", &a[i]);
v[i].val = a[i];
v[i].poz = i;
}
}
inline void Normalizare()
{
sort(v+1,v+n+1, cmp);
for(int i = 1;i <= n; ++i)
a[v[i].poz] = a[v[i-1].poz]+!(v[i].val==v[i-1].val);
}
inline void Solve()
{
int st=1,dr1=1,dr2=1,cnt1=1,cnt2=1;
fr1[a[1]]=fr2[a[1]]=1;
while(dr1<=n)
{
if(cnt1<p)
{
++dr1;
if(++fr1[a[dr1]]==1)
++cnt1;
}
if(cnt2<=u && dr2<n)
{
++dr2;
if(++fr2[a[dr2]]==1)
++cnt2;
}
else
if(cnt1>=p && cnt2<=u+1)
{
sol+=dr2-dr1;
if(cnt2<=u)
sol++;
if(--fr1[a[st]]==0)
--cnt1;
if(--fr2[a[st]]==0)
--cnt2;
++st;
}
}
}
inline void Write()
{
freopen ("secv5.out", "w", stdout);
printf("%lld\n", sol);
}
int main()
{
Citire();
Normalizare();
Solve();
Write();
return 0;
}