Pagini recente » Cod sursa (job #2677427) | Cod sursa (job #1960834) | Cod sursa (job #2099452) | Cod sursa (job #2131808) | Cod sursa (job #3316576)
#include<fstream>
using namespace std;
ifstream cin("secv5.in");
ofstream cout("secv5.out");
const int Z=4096,M=666013,N=1048576;
unsigned v[N],p=Z;
char s[Z];
struct element {
unsigned num;
int freq;
};
inline char A()
{
if(p==Z)
cin.read(s,Z),p=0;
return s[p++];
}
unsigned B()
{
unsigned n=0;
char c=A();
for(;c>47;n=c-48+n*10,c=A());
return n;
}
class HashTable {
private:
element key[N];
int head[M],nxt[N],mod,curr;
public:
HashTable(int modulo)
{
mod=modulo,curr=0;
for(int i=0;i<mod;head[i++]=-1);
for(int i=0;i<N;nxt[i++]=-1);
}
void init(int modulo)
{
mod=modulo,curr=0;
for(int i=0;i<mod;head[i++]=-1);
for(int i=0;i<N;nxt[i]=-1,key[i++].freq=0);
}
int getkey(unsigned x)
{
return x%mod;
}
int add(unsigned x)
{
int list=getkey(x),it=head[list],retval=0;
for(;it!=-1&&key[it].num!=x;it=nxt[it]);
it==-1?key[curr].num=x,key[curr].freq=1,nxt[curr]=head[list],head[list]=curr++,retval=1:++key[it].freq;
return retval;
}
bool find(unsigned x)
{
int list=getkey(x),it=head[list];
for(;it!=-1&&key[it].num!=x;it=nxt[it]);
return it!=-1;
}
int erase(unsigned x)
{
int list=getkey(x),ant=head[list],it=nxt[ant],retval=0;
if(key[ant].num==x) {
if(!--key[ant].freq)
head[list]=nxt[ant],retval=1;
} else {
for(;it!=-1&&key[it].num!=x;ant=it,it=nxt[it]);
if(it!=-1&&!--key[it].freq)
nxt[ant]=nxt[it],retval=1;
}
return retval;
}
};
HashTable ht(0);
long long cntSecv(unsigned v[],int n,int x)
{
ht.init(M);
int distinct_elements=0,left=0;
long long nr_secv=0;
for(int right=0;right<n;nr_secv+=(long long)right-left+1,++right)
for(distinct_elements+=ht.add(v[right]);left<=right&&distinct_elements>x;distinct_elements-=ht.erase(v[left++]));
return nr_secv;
}
int main()
{
int n=B(),l=B(),u=B();
for(int i=0;i<n;v[i++]=B());
return cout<<cntSecv(v,n,u)-cntSecv(v,n,l-1),0;
}