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