Cod sursa(job #791451)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 24 septembrie 2012 11:40:09
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.15 kb
#include<fstream>
#include<algorithm>
using namespace std;
int n,L,U;
struct Element{int val,poz;};
Element A[1050000];
int v[1050000],viz[1050000];

inline void Citire()
{
	int i;
	ifstream fin("secv5.in");
	fin>>n>>L>>U;
	for(i=1;i<=n;i++)
	{
		fin>>A[i].val;
		A[i].poz=i;
	}
	fin.close();
}

inline bool Sortare(Element A,Element B)
{
	return A.val<B.val;
}

inline void Normalizare()
{
	int i,poz,x;
	sort(A+1,A+n+1,Sortare);
	for(i=1;i<=n;i++)
	{
		x=A[i].val;
		poz=i;
		v[A[i].poz]=poz;
		while(i<n && A[i+1].val==x)
		{
			i++;
			v[A[i].poz]=poz;
		}
	}
}

inline void Reset(int v[])
{
	int i;
	for(i=1;i<=n;i++)
		v[i]=0;
}

inline long long Nr(int size)
{
	long long sol=0;
	int st=1,dr=1,now=0;
	while(dr<=n)
	{
		if(viz[v[dr]]==0)
			now++;
		viz[v[dr]]++;
		while(now>size)
		{
			if(viz[v[st]]==1)
				now--;
			viz[v[st]]--;
			st++;
		}
		sol+=(long long)(dr-st+1);
		dr++;
	}
	Reset(viz);
	return sol;
}

inline void Afisare()
{
	ofstream fout("secv5.out");
	fout<<(Nr(U)-Nr(L-1))<<"\n";
	fout.close();
}

int main()
{
	Citire();
	Normalizare();
	Afisare();
	return 0;
}