Cod sursa(job #3316576)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 19 octombrie 2025 11:46:50
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.16 kb
#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;
}