Pagini recente » Cod sursa (job #2015388) | Rating Razvan Cazacu (Razvan2006Cazacu) | Cod sursa (job #2786795) | Cod sursa (job #1777406) | Cod sursa (job #2008619)
#include <fstream>
#include <cstdio>
#include <vector>
#include <unordered_map>
#define VAL 1050005
#define MOD 666013
#define UI unsigned int
using namespace std;
UI N, L, U, i, j;
UI v[VAL], a[VAL];
UI b[VAL], be, nr;
long long ANS;
unordered_map <UI, UI> H;
vector < pair <int, int> > V[MOD];
vector < pair <int, int> > :: iterator it;
char buff[VAL];
UI poz=0;
UI citeste()
{
UI nr=0;
while (buff[poz]<'0' || buff[poz]>'9')
if (++poz==VAL)
fread(buff, 1, VAL, stdin), poz=0;
while ('0'<=buff[poz] && buff[poz]<='9')
{
nr=nr*10+buff[poz]-'0';
if (++poz==VAL)
fread(buff, 1, VAL, stdin), poz=0;
}
return nr;
}
void Add(UI nr)
{
UI K=nr % MOD;
for (it=V[K].begin(); it!=V[K].end(); it++)
{
if (it->first==nr)
{
it->second++;
return;
}
}
V[K].push_back(make_pair(nr, 1));
}
void Substract(UI nr)
{
UI K=nr % MOD;
for (it=V[K].begin(); it!=V[K].end(); it++)
{
if (it->first==nr)
{
it->second--;
return;
}
}
}
UI Check(UI nr)
{
UI K=nr % MOD;
for (it=V[K].begin(); it!=V[K].end(); it++)
if (it->first==nr)
return it->second;
}
int main()
{
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
N=citeste();
L=citeste();
U=citeste();
be=1;
for (i=1; i<=N; i++)
v[i]=citeste();
i=0;
while (nr<U)
{
i++;
if (i>N)
break;
Add(v[i]);
if (Check(v[i])==1)
nr++;
}
a[i]=1;
be=1;
while (i<N)
{
i++;
Add(v[i]);
if (Check(v[i])==1)
nr++;
while (nr>U)
{
Substract(v[be]);
if (Check(v[be])==0)
nr--;
be++;
}
a[i]=be;
}
for (i=1; i<=N; i++)
V[v[i] % MOD].clear();
i=0;
nr=0;
while (nr<L)
{
i++;
if (i>N)
break;
Add(v[i]);
if (Check(v[i])==1)
nr++;
}
be=1;
for (j=i; j<=N; j++)
{
while (nr>=L)
{
Substract(v[be]);
if (Check(v[be])==0)
nr--;
be++;
}
be--;
nr++;
Add(v[be]);
b[j]=be;
Add(v[j+1]);
if (Check(v[j+1])==1)
nr++;
}
for (i=1; i<=N; i++)
{
if (a[i]==0 && b[i]>0)
ANS+=b[i];
if (a[i]>0 && b[i]>0)
ANS+=b[i]-a[i]+1;
}
printf("%lld\n", ANS);
return 0;
}