Pagini recente » Cod sursa (job #641920) | Cod sursa (job #2656765) | Cod sursa (job #2656846) | Cod sursa (job #1321235) | Cod sursa (job #2658613)
#include <stdio.h>
#include <vector>
using namespace std;
const int NMAX = (1<<20);
const int MOD = 666013;
vector < pair < unsigned int, int > > h[MOD];
unsigned int v[NMAX];
int k=0;
void add_hash(unsigned int x) {
unsigned int i=0,cod=x%MOD;
while(i<h[cod].size() && h[cod][i].first!=x)
i++;
if(i==h[cod].size()) {
h[cod].push_back({x,1});
k++;
} else
h[cod][i].second++;
}
void del_hash(unsigned int x) {
unsigned int i=0,cod=x%MOD;
while(i<h[cod].size() && h[cod][i].first!=x)
i++;
if(i<h[cod].size()) {
h[cod][i].second--;
if(h[cod][i].second==0) {
h[cod].erase(h[cod].begin()+i);
k--;
}
}
}
long long solve(int n,int dist) {
int st,dr;
long long cate=0;
for(st=0;st<MOD;st++)
h[st].clear();
k=0;
st=dr=0;
while(dr<n) {
add_hash(v[dr++]);
while(st<n && k>dist)
del_hash(v[st++]);
cate+=(long long)dr-st+1;
}
return cate;
}
int main() {
FILE *fin,*fout;
int n,l,r,i;
fin=fopen("secv5.in","r");
fscanf(fin,"%d%d%d",&n,&l,&r);
for(i=0;i<n;i++)
fscanf(fin,"%d",&v[i]);
fclose(fin);
fout=fopen("secv5.out","w");
fprintf(fout,"%lld",solve(n,r)-solve(n,l-1));
fclose(fout);
return 0;
}