Cod sursa(job #381421)

Utilizator indestructiblecont de teste indestructible Data 10 ianuarie 2010 16:43:21
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#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;
}