Cod sursa(job #555953)

Utilizator bog29Antohi Bogdan bog29 Data 15 martie 2011 21:01:23
Problema Secventa 5 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<fstream>
#include<vector>
#include<algorithm>
#define dmax 1100000
#define mod 514229
using namespace std;
ifstream in("secv5.in");
ofstream out("secv5.out");

unsigned int n,k,l,u, nr, x[dmax],nr2;
unsigned int z[mod], w[dmax], pasu, pasl;
unsigned int sol;

vector<unsigned int>v;
vector<unsigned int>::iterator it;

void norm()
{	int i;
	
	sort(v.begin(), v.end() );
	
	it = unique(v.begin(), v.end() );
	
	v.erase(it, v.end() );

	for(i=1; i<=n; i++)
	{	it = lower_bound(v.begin(), v.end(), x[i]);
		x[i] = it - v.begin();
	}
}

int main()
{	
	int i;

	in>>n>>l>>u;
	
	for(i=1;i<=n;i++)
	{	in>>x[i];		
		v.push_back(x[i]);
	}	
	in.close();	
	
	norm();
	
	pasu = 1;
	pasl = 1;
	z[x[1]]=1;
	w[x[1]]=1;
	nr = 1;
	nr2 = 1;

	if(l==1)
		sol=1;
	
	for(i=2; i<=n; i++)
	{	
		k = x[i];

		if(!z[k])
			nr++;
		
		z[k]++;
		
		while(nr > u && pasu < i)
		{	
			k = x[pasu];
			
			z[k]--;
			if(!z[k])
				nr--;
			pasu++;
		}
		
		sol += (i - pasu +1);
		
		k = x[i];
		
		if(!w[k])
			nr2++;
		
		w[k]++;

		while(nr2 > l-1 && pasl < i)
		{	
			k = x[pasl];
			
			w[k]--;
			if(!w[k])
				nr2--;
			pasl++;
		}
		
		
		if(l!=1)
			sol -= (i - pasl +1);
	}
	
	out<<sol;
	
	out.close();
	return 0;
}