Cod sursa(job #536949)

Utilizator loginLogin Iustin Anca login Data 19 februarie 2011 20:07:22
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.01 kb
# include <fstream>
# include <iostream>
# include <algorithm>
# include <vector>
# define K 666013
# define DIM 1050000
# define pb push_back
# define mp make_pair
using namespace std;
int n, l, u, cx[DIM], cy[DIM], v[DIM];
vector < pair<unsigned,int> > H[DIM+3];
long long sol;

void read ()
{
	ifstream fin ("secv5.in");
	fin>>n>>l>>u;
	unsigned x, j;
	int k, pp, q=0;
	for(int i=1;i<=n;++i)
	{
		fin>>x;
		k=x%K;
		pp=0;
		for(j=0;j<H[k].size() && !pp;++j)
			if (H[k][j].first==x)
				v[i]=H[k][j].second, pp=1;
		if (!pp)
		{
			H[k].pb(mp(x,++q));
			v[i]=q;
		}
	}	
}

void solve ()
{
	int nx=0, ny=0, x=1, y=1;
	for(int i=1;i<=n;++i)
	{
		if (!cx[v[i]])
			++nx;
		++cx[v[i]];
		while (nx>=l && x<=i)
		{
			--cx[v[x]];
			if (!cx[v[x]])
				--nx;
			++x;
		}
		if (!cy[v[i]])
			++ny;
		++cy[v[i]];
		while (ny>u && y<=i)
		{
			--cy[v[y]];
			if (!cy[v[y]])
				--ny;
			++y;
		}
		if (nx==l-1 && ny<=u && ny>=l)
			sol+=x-y;
	}
}

int main ()
{
	read ();
	solve ();
	ofstream fout ("secv5.out");
	fout<<sol;
	return 0;
}