Pagini recente » Cod sursa (job #1813530) | Cod sursa (job #1713099) | Cod sursa (job #971202) | Cod sursa (job #2605967) | Cod sursa (job #993248)
Cod sursa(job #993248)
#include <fstream>
#include <algorithm>
#define Nmax 1048580
using namespace std;
int fr1[Nmax],fr2[Nmax],n,p,u;
long long sol;
unsigned long long a[Nmax];
struct nr
{
int val,poz,nv;
};
nr v[Nmax];
inline bool Compara(const nr A, const nr B)
{
return A.val<B.val;
}
inline void Normalizare()
{
int i;
for(i=1;i<=n;i++)
{
v[i].poz=i;
v[i].val=a[i];
}
sort(v+1,v+n+1,Compara);
v[1].nv = 1;
for(i=2;i<=n;i++)
if (v[i].val == v[i-1].val)
v[i].nv = v[i-1].nv;
else v[i].nv = v[i-1].nv + 1;
for(i=1;i<=n;i++)
a[v[i].poz]=v[i].nv;
}
int main()
{
int i,j,st=1,dr1=1,dr2=1,cnt1=1,cnt2=1;
ifstream fin("secv5.in");
ofstream fout("secv5.out");
fin>>n>>p>>u;
for(i=1;i<=n;i++)
fin>>a[i];
fin.close();
Normalizare();
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=sol+dr2-dr1;
/*for(i=dr1;i<=dr2;i++)
{
for(j=st;j<=i;j++)
fout<<a[j]<<" ";
fout<<"\n";
}*/
if(cnt2<=u)
sol++;
if(--fr1[a[st]]==0)
--cnt1;
if(--fr2[a[st]]==0)
--cnt2;
++st;
}
}
if(cnt1==p && cnt2==p+1)
sol=sol+dr2-dr1;
fout<<sol<<"\n";
fout.close();
return 0;
}