Cod sursa(job #839506)

Utilizator okros_alexandruOkros Alexandru okros_alexandru Data 21 decembrie 2012 21:54:58
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <fstream>
#include <vector>
#include <cstdio>
#define NMAx (1<<20)+1
#define MOD 666013
using namespace std;

vector < pair<unsigned int,int> > Hash[MOD];
unsigned int V[NMAx];
int N,U,L,mark[NMAx];

int findHash(int X) {
	
	for(int i=0;i<Hash[X%MOD].size();i++)
		if(Hash[X%MOD][i].first==X)
			return Hash[X%MOD][i].second;
	
	return -1;
	
}
long long Query(int K) {
	
	int i,j,Nr;
	long long Sol;
	
	memset(mark,0,sizeof(mark));
	
	for(i=1,j=1,Nr=0,Sol=0;i<=N;i++) {
		
		if(!mark[V[i]])
			Nr++;
		mark[V[i]]++;
		
		while(Nr>K) {
			if(mark[V[j]]==1)
				Nr--;
			--mark[V[j++]];
			}
		
		Sol+=i-j+1;
		
		}
	
	//for(;j<=N;--mark[V[j++]]);
	
	return Sol;
	
}
void Write() {
	
	ofstream out("secv5.out");
	out<<(Query(U)-Query(L-1))<<'\n';
	out.close();
	
}
void Read() {
	
	int i,P,Nr;
	ifstream in("secv5.in");
	
	in>>N>>L>>U;
	for(i=1,Nr=0;i<=N;i++) {
		
		in>>V[i];
		P=findHash(V[i]);
		if(P==-1) {
			Hash[V[i]%MOD].push_back(make_pair(V[i],++Nr));
			V[i]=Nr;
			}
		else
			V[i]=P;
		
		}
		
	in.close();

}
int main() {
	
	Read();
	Write();
	
	return 0;
	
}