Pagini recente » Cod sursa (job #206311) | Cod sursa (job #16266) | Cod sursa (job #1724413) | Cod sursa (job #1129808) | Cod sursa (job #2581868)
#include <iostream>
#include <cstdio>
#include <fstream>
using namespace std;
ifstream fin("secv5.in");
ofstream fout("secv5.out");
const int N = (1 << 20);
const int K = 666019;
int v[N];
int nr;
int val[N], urm[N], f[N], lst[K];
int apartine(int x){
int c = x % K;
for(int p=lst[c]; p!=0; p=urm[p])
if(val[p] == x)
return p;
return -1;
}
int dif1, dif2;
void adauga(int x){
int poz = apartine(x);
if(poz != -1){
f[poz]++;
return;
}
dif1++, dif2++;
int c = x % K;
val[++nr] = x;
urm[nr] = lst[c];
f[nr] = 1;
lst[c] = nr;
}
bool sterge(int x){
int poz = apartine(x);
f[poz]--;
if(f[poz] > 0)
return false;
int c = x % K;
int p = lst[c];
if(val[p] == x)
lst[c] = urm[p];
else{
while(urm[p] != 0 && val[urm[p]] != x)
p = urm[p];
if(urm[p] != 0)
urm[p] = urm[urm[p]];
}
return true;
}
int main()
{
int n,l,u,i,ans,j1,j2;
bool deleted;
fin >> n >> l >> u;
j1 = j2 = 0;
ans = 0;
for(i=0; i<n; i++){
fin >> v[i];
adauga(v[i]);
while(dif2 > l-1){
deleted = sterge(v[j2]);
dif2 -= (int)deleted;
j2++;
}
while(dif1 > u){
deleted = sterge(v[j1]);
dif1 -= (int)deleted;
j1++;
}
ans += (j2 - j1);
}
fout << ans << "\n";
return 0;
}