Cod sursa(job #791705)

Utilizator mihaipopa12Popa Mihai mihaipopa12 Data 24 septembrie 2012 21:26:37
Problema Secventa 5 Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include<stdio.h>
#include<vector>

#define maxn (1<<20)+5
#define MOD ((1<<19)-1)
#define pb push_back
#define mp make_pair
#define file_size 11000000

using namespace std;

FILE*f=fopen("secv5.in","r");
FILE*g=fopen("secv5.out","w");

int n,l,u,i,nrst,nrdr,ch;
unsigned int v[maxn];
long long sol;
vector< pair<unsigned int,int> >H[MOD+5];
char buff[file_size+5];

inline unsigned int next () {
	unsigned int r = 0; 
	
	while ( buff[ch] >= '0' && buff[ch] <= '9' ){
		r = r * 10 + buff[ch] - '0';
		++ch;
	}
	++ch;
	
	return r;
}

inline bool insert ( unsigned int val , int tip ){
	int list = val & MOD; vector< pair<unsigned int,int> >::iterator itt;
	
	for ( itt = H[list].begin() ; itt != H[list].end() ; ++itt ){
		if ( itt->first == val ){
			++itt->second;
			return 0;
		}
	}
	
	H[list].pb(mp(val,1)); return 1;
}

inline void erase ( unsigned int val ){
	int list = val & MOD; vector< pair<unsigned int,int> >::iterator itt;
	
	for ( itt = H[list].begin() ; itt != H[list].end() ; ++itt ){
		if ( itt->first == val ){
			--itt->second;
			if ( !itt->second ){
				*itt = H[list][H[list].size()-1]; H[list].pop_back(); --nrst;
			}
			return ;
		}
	}
}

inline void citire () {
	
	fread(buff,file_size,1,f);
	
	n = next(); l = next(); u = next();
	
	for ( i = 1 ; i <= n ; ++i ){
		v[i] = next();
	}
}

inline long long solve ( int u ) {
	
	int st = 1; nrst = 0; long long sol = 0;
	
	for ( i = 1 ; i <= n ; ++i ){
		
		nrst += insert(v[i],1);
		
		while ( nrst > u ){
			erase(v[st]); ++st;
		}
		
		sol += i - st;
	}
	
	return sol;
}

int main () {
	
	citire();
	
	long long sol1 = solve(l-1);
	
	for ( int i = 0 ; i < MOD ; ++i ){
		H[i].clear();
	}
	
	long long sol2 = solve(u);
	
	fprintf(g,"%lld\n",sol2-sol1);
	
	fclose(f);
	fclose(g);
	
	return 0;
}