Pagini recente » Cod sursa (job #3251910) | Cod sursa (job #1529962) | Cod sursa (job #1641210) | Cod sursa (job #2185432) | Cod sursa (job #682962)
Cod sursa(job #682962)
#include<cstdio>
#include<list>
#include<vector>
#define MOD 666013
#define U unsigned
using namespace std;
list <U> Hl[MOD], Hu[MOD];
vector <U> v;
char buff[8192];
U n, l, u, nrl, nru, poz;
void Check(){
if (++poz == 8192) poz = 0, fread(buff, 1, 8192, stdin);
}
void Read(U &nr){
nr = 0;
while(buff[poz] < '0' || buff[poz] > '9') Check();
while(buff[poz] >= '0' && buff[poz] <= '9'){
nr = nr * 10 + buff[poz] - '0';
Check();
}
}
bool inHash(U x, list <U> H[]){
list <U> :: iterator it;
for (it = H[x % MOD].begin(); it != H[x % MOD].end(); it++)
if (*it == x) return true;
return false;
}
long long Subs(U l, U u){ //nr de subs cu maxim N nr distincte
U i, jl, ju; long long nSubl, nSubu;
for(i = jl = ju = nSubu = nSubl = nrl = nru = 0; i < n; i++){
if(!inHash(v[i], Hl)) nrl++;
Hl[v[i] % MOD].push_back(v[i]);
while(nrl > l){
Hl[v[jl] % MOD].pop_front();
if (!inHash(v[jl++], Hl)) nrl--;
}
nSubl += i - jl + 1;
if(!inHash(v[i], Hu)) nru++;
Hu[v[i] % MOD].push_back(v[i]);
while(nru > u){
Hu[v[ju] % MOD].pop_front();
if (!inHash(v[ju++], Hu)) nru--;
}
nSubu += i - ju + 1;
}
return nSubu - nSubl;
}
int main(){
freopen("secv5.in", "r", stdin), freopen("secv5.out", "w", stdout);
fread(buff, 1, 8192, stdin);
Read(n), Read(l), Read(u);
U i, x;
for(i = 0; i < n; i++)
Read(x), v.push_back(x);
printf("%lld\n", Subs(l-1, u));
return 0;
}