Pagini recente » Cod sursa (job #1530340) | Cod sursa (job #2474214) | Cod sursa (job #701931) | Cod sursa (job #2813046) | Cod sursa (job #811028)
Cod sursa(job #811028)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define maxn 1050000
#define mod 500001
int n ;
int L, U ;
vector < pair<unsigned int, int> > hash[mod] ;
int indice ;
unsigned int ind[maxn] ;
int cate[maxn] ;
char sir[64] ;
int gasit(unsigned int x)
{
int r = x % mod ;
int len = hash[r].size() ;
for( int i = 0; i < len; ++i )
if( hash[r][i].first == x )
return hash[r][i].second ;
return -1 ;
}
void adauga(unsigned int x, int poz)
{
int ok = gasit( x ) ;
if( ok == -1 )
{
int r = x % mod ;
hash[r].push_back( make_pair( x, indice )) ;
ind[poz] = indice ;
++indice ;
}
else
ind[poz] = ok ;
}
long long numar(int nrmax)
{
int nrdif = 0 ;
int st = -1 ;
long long sol = 0 ;
for(int i = 0; i < n; ++i )
{
if( ! cate[ ind[i] ] )
++nrdif ;
++cate[ ind[i] ] ;
while( st < i && nrdif > nrmax )
{
++st ;
--cate[ ind[st] ] ;
if( ! cate[ ind[st] ] )
--nrdif ;
}
sol += i - st ;
}
return sol;
}
int main()
{
freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
scanf("%d%d%d",&n, &L, &U);
for(int i = 0; i < n; ++i )
{
scanf ("%s", sir);
unsigned int x = 0 ;
for(int j = 0 ; sir[j] >= '0' && sir[j] <= '9'; ++j )
x = x * 10 + ( sir[j] - '0' ) ;
adauga( x, i ) ;
}
long long sol1 = numar(U) ;
memset( cate, 0, sizeof(cate) ) ;
long long sol2 = numar(L-1) ;
long long sol = sol1 - sol2 ;
printf("%lld\n", sol);
return 0;
}