Pagini recente » Cod sursa (job #2611880) | Cod sursa (job #2697002) | Cod sursa (job #2443237) | Cod sursa (job #941762) | Cod sursa (job #1528427)
# include <fstream>
# include <algorithm>
# include <vector>
# define MOD 666013
# define NR 1100000
# define f first
# define s second
using namespace std;
ifstream f("secv5.in");
ofstream g("secv5.out");
vector <pair <unsigned int, int > > v[MOD+5];
int i,j,n,m,L,U;
unsigned int A[NR];
int num (unsigned int K) {
int cod=K%MOD;
for (int i=0; i<v[cod].size(); ++i)
if (v[cod][i].f==K) return v[cod][i].s;
return 0;
}
void update (unsigned int K, int X) {
int cod=K%MOD;
for (int i=0; i<v[cod].size(); ++i)
if (v[cod][i].f==K) {
v[cod][i].s+=X;
return;
}
v[cod].push_back(make_pair(K, 1));
}
// numarul de secvente cu pana la L elemente diferite
long long numara (int L) {
long long sol=0, Edif=0;
int ci=1; Edif=1; update (A[1], 1);
if (L) sol=1;
for (int i=2; i<=n; ++i) {
update (A[i], 1); if (num(A[i])==1) ++Edif;
while (Edif>L) {
update (A[ci], -1);
if (num(A[ci])==0) --Edif;
++ci;
}
sol+=i-ci+1;
}
//curat
while (ci<=n) {
update(A[ci], -1);
++ci;
}
return sol;
}
int main ()
{
f>>n>>L>>U;
for (i=1; i<=n; ++i)
f>>A[i];
g<<numara(U)-numara(L-1);
return 0;
}