Cod sursa(job #791481)

Utilizator scipianusFMI Ciprian Olariu scipianus Data 24 septembrie 2012 12:23:02
Problema Secventa 5 Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include<fstream>
#include<algorithm>
#include<cstring>
#include<vector>
#define MOD 123007
using namespace std;
int n,L,U,nmax,p;
unsigned int v[1050000];
struct ElementH{unsigned int val;int nr;};
vector <ElementH> H[2][123007];

inline void Citire()
{
	int i,ns,poz;
	unsigned int aux;
	char s[20];
	ifstream fin("secv5.in");
	fin>>n>>L>>U;
	fin.getline(s,20);
	for(i=1;i<=n;i++)
	{
		fin.getline(s,20);
		ns=strlen(s);
		poz=0;
		aux=0;
		while(poz<ns)
			aux=aux*10+s[poz++]-'0';
		v[i]=aux;
	}
	fin.close();
}

inline bool Found(unsigned int x)
{
	int i,poz=x%MOD;
	for(i=H[p][poz].size()-1;i>=0;i--)
	{
		if(H[p][poz][i].val==x)
		{
			if(H[p][poz][i].nr>0)
				return true;
			return false;
		}
	}
	return false;
}

inline void Add(unsigned int x)
{
	int i,poz=x%MOD;
	for(i=H[p][poz].size()-1;i>=0;i--)
	{
		if(H[p][poz][i].val==x)
		{
			H[p][poz][i].nr++;
			return;
		}
	}
	ElementH aux;
	aux.val=x;
	aux.nr=1;
	H[p][poz].push_back(aux);
}

inline void Delete(unsigned int x)
{
	int i,poz=x%MOD;
	for(i=H[p][poz].size()-1;i>=0;i--)
	{
		if(H[p][poz][i].val==x)
		{
			H[p][poz][i].nr--;
			return;
		}
	}
}

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

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

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