Pagini recente » Cod sursa (job #604670) | Cod sursa (job #954558) | Cod sursa (job #1777310) | Cod sursa (job #352140) | Cod sursa (job #13021)
Cod sursa(job #13021)
#include <stdio.h>
#include <fstream>
#include <vector>
#include <iterator>
#include <map>
using namespace std;
#define in "secv5.in"
#define out "secv5.out"
vector<unsigned long int> v;
vector<unsigned long int> ok;
vector<unsigned long int> L;
unsigned long int n;
unsigned long int l,u;
vector<unsigned long int> sel;
void ReadData();
int main()
{
ReadData();
return 0;
}
void ReadData()
{
map<unsigned long int,int> s;
unsigned long int i, j;
freopen(in,"r",stdin);
freopen(out,"w",stdout);
scanf("%lu%lu%lu", &n,&l,&u);
v.resize(n+1);
ok.resize(n+1);
L.resize(n+1);
for ( i = 1; i <= n; i++ )
{
scanf("%lu", &v[i]);
ok[i] = v[i];
}
sort( ok.begin(), ok.end() );
int k = 0;
for ( i = 1; i <= n; i++ )
{
if ( ok[i] == ok[i+1] && i < n ) k++;
s[ok[i]] = i-k;
}
sel.resize(n-k);
for ( i = 1; i <= n; i++ )
{
v[i] = s[v[i]];
ok[i] = 0;
}
// pt l-1
unsigned long int nr=1, total=1;
L[1] = 1;
ok[v[1]] = 1;
for ( i = 2; i <= n; i++ )
{
ok[v[i]] += 1;
if ( ok[v[i]] == 1 ) nr++;
if ( nr > l-1 )
{
for ( j = L[i-1]; j <= i; j++ )
{
ok[v[j]] -= 1;
if ( ok[v[j]] == 0 ) nr--;
// printf("%d %d %d %d \n", ok[v[j]], v[j], i, j);
if ( nr == l-1 )
{
L[i] = j+1;
break;
}
}
}
else L[i] = L[i-1];
total += (i-L[i]+1);
}
for ( i = 1; i <= n; i++ )
{
ok[i] = 0;
}
// pt u
nr=1;
unsigned long int total2=1;
L[1] = 1;
ok[v[1]] = 1;
for ( i = 2; i <= n; i++ )
{
ok[v[i]] += 1;
if ( ok[v[i]] == 1 ) nr++;
if ( nr > u )
{
for ( j = L[i-1]; j <= i; j++ )
{
ok[v[j]] -= 1;
if ( ok[v[j]] == 0 ) nr--;
if ( nr == l-1 )
{
L[i] = j+1;
break;
}
}
}
else L[i] = L[i-1];
total2 += (i-L[i]+1);
}
total2-=total;
printf("%lu",total2);
}