Pagini recente » Cod sursa (job #2018252) | Cod sursa (job #1106006) | Cod sursa (job #2004151) | Cod sursa (job #3136203) | Cod sursa (job #1189085)
#include <cstdio>
FILE* in;
FILE* out;
unsigned int n,s,d;
const int Q=(1<<20)+1;
const int KEY=Q;
unsigned int v[Q];
unsigned int nrM,nrm;
unsigned int lstmax[KEY],valmax[Q],urmmax[Q],nrmax;
void inline addmax(int x)
{
int r=x&(KEY-1);
valmax[++nrmax]=x;
urmmax[nrmax]=lstmax[r];
lstmax[r]=nrmax;
}
bool inline findmax(int x)
{
int p=lstmax[x&(KEY-1)];
while(p!=0 && valmax[p]!=x)
p=urmmax[p];
return p!=0;
}
void inline stergemax(int x)
{
int r=x&(KEY-1),p;
if(x==valmax[lstmax[r]])
{
lstmax[r]=urmmax[lstmax[r] ];
return;
}
p=lstmax[r];
while(urmmax[p]!=0 && valmax[urmmax[p]]!=x)
p=urmmax[p];
if(valmax[urmmax[p]]==x)
urmmax[p]=urmmax[urmmax[p]];
}
unsigned int lstmin[KEY],valmin[Q],urmmin[Q],nrmin;
void inline addmin(int x)
{
int r=x&(KEY-1);
valmin[++nrmin]=x;
urmmin[nrmin]=lstmin[r];
lstmin[r]=nrmin;
}
bool inline findmin(int x)
{
int p=lstmin[x&(KEY-1)];
while(p!=0 && valmin[p]!=x)
p=urmmin[p];
return p!=0;
}
void inline stergemin(int x)
{
int r=x&(KEY-1),p;
if(x==valmin[lstmin[r]])
{
lstmin[r]=urmmin[lstmin[r] ];
return;
}
p=lstmin[r];
while(urmmin[p]!=0 && valmin[urmmin[p]]!=x)
p=urmmin[p];
if(valmin[urmmin[p]]==x)
urmmin[p]=urmmin[urmmin[p]];
}
int main()
{
in=fopen("secv5.in","r");
out=fopen("secv5.out","w");
fscanf(in,"%u%u%u",&n,&s,&d);
int i=1;
int stmin=1,stmax=1;
for( ; nrm<s && i<=n; i++)
{
fscanf(in,"%u",&v[i]);
if(findmax(v[i])==0)
{
nrM++;
nrm++;
}
addmin(v[i]);
addmax(v[i]);
}
while(true)
{
stergemin(v[stmin]);
if(findmin(v[stmin])==0)
{
addmin(v[stmin]);
break;
}
stmin++;
}
if(nrm<s)
{
fprintf(out,"0");
return 0;
}
long long rez=stmin-stmax+1;
for(; i<=n; i++)
{
fscanf(in,"%u",&v[i]);
if(findmax(v[i])==0)
{
nrM++;
while(nrM==d+1)
{
stergemax(v[stmax]);
stmax++;
if(findmax(v[stmax-1])==0)
nrM--;
}
}
addmax(v[i]);
if(findmin(v[i])==0)
nrm++;
addmin(v[i]);
while(nrm>s-1)
{
stergemin(v[stmin]);
stmin++;
if(findmin(v[stmin-1])==0)
nrm--;
}
nrm++;
stmin--;
addmin(stmin);
rez+=stmin-stmax+1;
}
fprintf(out,"%lld",rez);
return 0;
}