Pagini recente » Cod sursa (job #2467897) | Cod sursa (job #2821292) | Cod sursa (job #1383643) | Cod sursa (job #2263502) | Cod sursa (job #993280)
Cod sursa(job #993280)
#include <fstream>
#include <algorithm>
#define Nmax 1048580
using namespace std;
int fr1[Nmax],fr2[Nmax],n,p,u,a[Nmax];
long long sol;
unsigned long long t[Nmax];
struct nr
{
int poz,nv;
unsigned long long val;
bool operator <(const nr &A) const
{
return val<A.val;
}
};
nr v[Nmax];
inline void Normalizare()
{
int i;
for(i=1;i<=n;i++)
{
v[i].poz=i;
v[i].val=t[i];
}
sort(v+1,v+n+1);
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,st=1,dr1=1,dr2=1,cnt1=1,cnt2=1,poz;
unsigned long long aux;
char sir[25];
ifstream fin("secv5.in");
ofstream fout("secv5.out");
fin>>n>>p>>u;fin.get();
for(i=1;i<=n;i++)
{
fin.getline(sir,20);
aux=0;
for(poz=0;sir[poz];poz++)
aux=aux*10+sir[poz]-'0';
t[i]=aux;
}
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;
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;
}