Pagini recente » Cod sursa (job #3136283) | Cod sursa (job #171855) | Cod sursa (job #642021) | Cod sursa (job #2565751) | Cod sursa (job #381421)
Cod sursa(job #381421)
#include <stdio.h>
#include <vector>
#define NMAX 1<<20
#define MOD 666013
#define ui unsigned int
#define ll long long
#define mp make_pair
#define pb push_back
#define f first
#define s second
using namespace std;
int n,l,u,nr;
int A[NMAX+1],act[2],marc[NMAX+1];
vector < pair<ui,int> > v[MOD];
ll rez[2];
void read()
{
scanf("%d%d%d",&n,&l,&u);
int i,y,j;
ui x;
char find;
for (i=1; i<=n; i++)
{
scanf("%u",&x);
y=x%MOD; find=0;
for (j=0; j<v[y].size(); j++)
if (v[y][j].f==x)
{
A[i]=v[y][j].s;
find=1;
break;
}
if (!find)
{
nr++;
A[i]=nr;
v[y].pb(mp(x,nr));
}
}
act[0]=u;
act[1]=l-1;
}
void solve(int ind)
{
int i,dist=0,lim=1,j;
if (ind)
for (i=1; i<=nr; i++)
marc[i]=0;
for (i=1; i<=n; i++)
{
if (!marc[A[i]])
dist++;
marc[A[i]]++;
j=i;
if (dist>act[ind])
break;
else
rez[ind]+=i-lim+1;
}
i=j;
marc[A[i]]--;
if (dist>act[ind])
i--,dist--;
for (j=i+1; j<=n; j++)
{
if (!marc[A[j]])
dist++;
marc[A[j]]++;
if (dist>act[ind])
{
while (marc[A[lim]]>1)
{
marc[A[lim]]--;
lim++;
}
marc[A[lim]]--;
dist--;
lim++;
rez[ind]+=j-lim+1;
}
else
rez[ind]+=j-lim+1;
}
}
int main()
{
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
read();
solve(0);
solve(1);
printf("%lld\n",rez[0]-rez[1]);
return 0;
}