Pagini recente » Cod sursa (job #3309526) | Cod sursa (job #479568) | Cod sursa (job #2701682) | Cod sursa (job #1739974) | Cod sursa (job #3348103)
#include <bits/stdc++.h>
#define NMAX 1048576
#define MOD 1000003
using namespace std;
ifstream in("secv5.in");
ofstream out("secv5.out");
int v[NMAX+1];
struct element
{
int val, cnt, next;
};
struct hash_table
{
element elemente[NMAX+1];
int idx=0, last_pos[MOD];
int sz=0;
void insert(int x)
{
int mod=x%MOD;
for(int pos=last_pos[mod]; pos!=0; pos=elemente[pos].next)
{
if(elemente[pos].val==x)
{
elemente[pos].cnt++;
return;
}
}
idx++;
elemente[idx].val=x;
elemente[idx].next=last_pos[mod];
elemente[idx].cnt=1;
last_pos[mod]=idx;
sz++;
}
void erase(int x)
{
int mod=x%MOD;
for(int pos=last_pos[mod]; pos!=0; pos=elemente[pos].next)
{
if(elemente[pos].val==x)
{
elemente[pos].cnt--;
if(elemente[pos].cnt==0)
{
swap(elemente[pos].val, elemente[last_pos[mod]].val);
swap(elemente[pos].cnt, elemente[last_pos[mod]].cnt);
last_pos[mod]=elemente[last_pos[mod]].next;
sz--;
return;
}
}
}
}
} hash1, hash2;
int main()
{
int n, l, u;
in >> n >> l >> u;
int st=1, dr=1;
long long nr_subsecv=0;
for(int i=1; i<=n; i++)
{
in >> v[i];
hash1.insert(v[i]);
hash2.insert(v[i]);
while(hash1.sz>u && st<=i)
{
hash1.erase(v[st]);
st++;
}
while(hash2.sz>=l && dr<=i)
{
hash2.erase(v[dr]);
dr++;
}
nr_subsecv+=dr-st;
}
out << nr_subsecv;
return 0;
}