Pagini recente » Cod sursa (job #2658720) | Cod sursa (job #1313659)
#include<cstdio>
#include<vector>
#define MOD 666013
#define NMAX 1<<20+2
using namespace std;
int n,l,u;
unsigned int v[NMAX];
struct hash
{
unsigned int l,r;
};
vector<hash>H[MOD+1];
short cauta(int x)
{
int i;
int r=x%MOD;
for(i=0;i<H[r].size();++i)
if (H[r][i].l==x) return i;
return -1;
}
void add(int x,int poz)
{
int r=x%MOD;
if (poz==-1)
{
hash X;
X.l=x;X.r=1;
H[r].push_back(X);
}
else ++H[r][poz].r;
}
int sterge(int x)
{
int r=x%MOD;
int ok=0,i=0;
int k=0;
vector<hash>::iterator it;
it=H[r].begin();
while (it!=H[r].end())
{
hash X=*it;
if (X.l==x)
{
--H[r][i].r;
if (H[r][i].r==0) {H[r].erase(it);return 0;}
else return 1;
}
else {++it;++i;}
}
return 0;
}
long long sol(unsigned int x)
{
int i,j,nr=0;
long long rez=0;
for (i=1;i<MOD;++i)
H[i].clear();
for (i=1,j=1;i<=n;++i)
{
int poz=cauta(v[i]);
if (poz==-1) ++nr;
add(v[i],poz);
while(nr>x)
{
int cat=sterge(v[j]);
if (cat==0) --nr;
++j;
}
rez+=(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\n",sol(u)-sol(l-1));
return 0;
}