Pagini recente » Cod sursa (job #881838) | Cod sursa (job #1203890) | Rating Andreica Madalin-Andrei (Andreica_Madalin_Andrei_324CA) | Istoria paginii runda/bulangandit2/clasament | Cod sursa (job #1761535)
#include <cstdio>
#include <string.h>
#include <ctype.h>
#define BUF_SIZE 1048576
#define MAXN (1<<20)
#define MOD ((1<<22)-1)
#define uint unsigned int
uint n, r, pos=BUF_SIZE, v[MAXN+1], lista[MOD+1], nxt[MAXN+1], val[MAXN+1], fr[MAXN+1];
char buf[BUF_SIZE];
inline char getChar(FILE *f)
{
if(pos == BUF_SIZE) pos=0, fread(buf, 1, BUF_SIZE, f);
return buf[pos++];
}
inline uint getInt(FILE *f)
{
uint nr=0;
char c;
while(!isdigit(c)) c=getChar(f);
while(isdigit(c)) nr = nr*10 + c - '0', c=getChar(f);
return nr;
}
inline void adauga(uint x)
{
int mod = (x&MOD), p;
p=lista[mod];
while(p)
{
if(val[p] == x)
{
fr[p]++;
return;
}
p=nxt[p];
}
val[++r]=x;
fr[r]=1;
nxt[r]=lista[mod];
lista[mod]=r;
}
inline void sterge(uint x)
{
int mod = (x&MOD), p;
p=lista[mod];
while(p)
{
if(val[p] == x)
{
fr[p]--;
return;
}
p=nxt[p];
}
}
inline int check(uint x)
{
int mod = (x&MOD), p;
p=lista[mod];
while(p)
{
if(val[p] == x)
return fr[p];
p=nxt[p];
}
return 0;
}
inline long long secv(int u)
{
int i, dif=0, st=1;
long long ans=0;
for(i=1;i<=n;++i)
{
adauga(v[i]);
if(check(v[i]) == 1) dif++;
while(dif > u)
{
sterge(v[st]);
if(!check(v[st])) dif--;
st++;
}
ans+=i-st+1;
}
return ans;
}
int main()
{
FILE *fin, *fout;
fin = fopen("secv5.in", "r");
fout = fopen("secv5.out", "w");
uint i, l, u;
long long a, b;
n=getInt(fin);
l=getInt(fin);
u=getInt(fin);
for(i=1;i<=n;++i)
v[i]=getInt(fin);
a=secv(u);
memset(lista, 0, sizeof(lista));
r=0;
b=secv(l-1);
fprintf(fout, "%lld", a-b);
return 0;
}