Cod sursa(job #2795151)

Utilizator SeracovanuEdwardSeracovanu Edward SeracovanuEdward Data 6 noiembrie 2021 00:27:38
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <bits/stdc++.h>

using namespace std;
int n,l,u;
const int MOD=666013,NMAX=(1<<21);
unsigned int v[NMAX];
vector <pair<unsigned int,unsigned int>> A[MOD+100];
int adauga(unsigned int val,unsigned int &k){
unsigned int i,limita=A[val%MOD].size(),r=val%MOD;
for(i=0;i<limita;i++)
    if(A[r][i].first==val){
        A[r][i].second++;
        break;
    }
if(i==limita){
A[r].push_back(make_pair(val,1));
k++;
}
}
void sterge(unsigned int val,unsigned int &k){
unsigned int i,limita=A[val%MOD].size(),r=val%MOD;
for(i=0;i<limita;i++){
if(A[r][i].first==val){
    A[r][i].second--;
    if(A[r][i].second==0){
        k--;
        swap(A[r][i],A[r][limita-1]);
        A[r].pop_back();
        break;
    }
}
}
}
long long int solutie(unsigned int val){
for(int i=0;i<MOD;i++)
    A[i].clear();
unsigned int j=1,k=0;
long long int rez=0;
for(int i=1;i<=n;i++){
    adauga(v[i],k);
    while(k>val){
        sterge(v[j],k);
        j++;
    }
    rez=rez+1LL*(i-j+1);
}
return rez;
}
int main()
{
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    scanf("%d%d%d",&n,&l,&u);
    for(int i=1;i<=n;i++)
        scanf("%u",&v[i]);
    printf("%lld",solutie(u)-solutie(l-1));
    return 0;
}