Pagini recente » Cod sursa (job #2989269) | Cod sursa (job #2990673) | Cod sursa (job #1867915) | Cod sursa (job #1111126) | Cod sursa (job #993274)
Cod sursa(job #993274)
#include <fstream>
#include <algorithm>
#define Nmax 1048586
#define Lim 1000000
#define In "secv5.in"
#define Out "secv5.out"
#define Next ++pos == Lim ? f.read (Buffer, Lim), pos = 0 : 0
#define PII pair< int ,int >
#define val first
#define poz second
using namespace std;
int fr1[Nmax],fr2[Nmax], a[Nmax],n, p, sol, q,pos;
PII v[Nmax];
ifstream f(In);
char Buffer[Lim];
inline void Read(int &x)
{
for( ;!('0' <= Buffer[pos] && Buffer[pos]<='9');Next);
for(x = 0;('0' <= Buffer[pos] && Buffer[pos]<='9');Next)
x = x*10+Buffer[pos]-'0';
}
inline void Read()
{
f.read(Buffer,Lim);
Read(n);Read(p);Read(q);
for(int i = 1;i <= n; ++i)
{
Read(a[i]);
v[i].val = a[i];
v[i].poz = i;
}
}
int compare (const void * a, const void * b)
{
return ( *(int*)a - *(int*)b );
}
inline void Normalizare()
{
sort(v+1,v+n+1);
for(int i = 1;i <= n; ++i)
a[v[i].poz] = a[v[i-1].poz]+!(v[i].val==v[i-1].val);
}
ofstream g(Out);
inline void Solve()
{
int st = 1,dr1 = 1,dr2 = 1,cnt1 = 1,cnt2 = 1;
fr1[a[1]]++;
fr2[a[1]]++;
while(dr1 <= n)
{
if(cnt1 < p)
{
++dr1;
if(++fr1[a[dr1]]==1)
++cnt1;
}
if(cnt2 <= q && dr2<n)
{
++dr2;
if(++fr2[a[dr2]]==1)
++cnt2;
}
else
{
if(cnt1>=p)
{
sol += dr2-dr1;
if(cnt2<=q)
++sol;
if(--fr1[a[st]]==0)
--cnt1;
if(--fr2[a[st]]==0)
--cnt2;
st++;
}
}
}
}
inline void Write()
{
g<<sol<<"\n";
g.close();
}
int main()
{
Read();
Normalizare();
Solve();
Write();
return 0;
}