Pagini recente » Cod sursa (job #791477) | Cod sursa (job #1115695) | Cod sursa (job #1736939) | Cod sursa (job #1448311) | Cod sursa (job #994121)
Cod sursa(job #994121)
#include <iostream>
#include <fstream>
#include <algorithm>
#define Nmax (1<<20) + 2
using namespace std;
int n, l, u;
int a[Nmax];
int fr1[Nmax], fr2[Nmax];
int sol;
struct str
{
int val, poz;
};
str v[Nmax];
inline bool cmp(const str A, const str B)
{
return A.val < B.val;
}
inline void Read()
{
ifstream f ("secv5.in");
f>>n>>l>>u;
int i;
for (i=1; i<=n; i++)
{
f>>a[i];
v[i].val = a[i];
v[i].poz = i;
}
f.close();
}
inline void Normalizare()
{
sort(v+1, v+n+1, cmp);
int i;
for(i=1; i<=n; i++)
a[v[i].poz] = a[v[i-1].poz]+!(v[i].val == v[i-1].val);
}
inline void Solve()
{
Normalizare();
int st, dr1, dr2;
dr1 = dr2 = 0;
st = 0;
int c1, c2;
c1 = c2 = 0;
bool gata;
while (dr2 <= n)
{
dr1++, dr2++;
if (dr2 <= n)
{
if (fr1[a[dr1]] == 0)
c1++;
if (fr2[a[dr2]] == 0)
c2++;
fr1[a[dr1]]++;
fr2[a[dr2]]++;
}
if (c1 == l)
{
gata = false;
while (c2 <= u && dr2 <= n)
{
dr2++;
if (dr2 <= n)
{
if (fr2[a[dr2]] == 0)
c2++;
fr2[a[dr2]]++;
}
}
if (c2 == u+1)
{
fr2[a[dr2]]--;
dr2--;
c2--;
}
else
dr2--;
while (dr1!=dr2)
{
while ((c1 == l && c2 == u) || (c1 == l && c2 < u && c2 >= l && dr2 == n))
{
st++;
sol += dr2 - dr1 + 1;
fr1[a[st]]--;
fr2[a[st]]--;
if (fr1[a[st]] == 0)
c1--;
if (fr2[a[st]] == 0)
c2--;
}
if (c2<=u && dr2<=n)
{
while (c2 <= u && dr2 <= n)
{
dr2++;
if (dr2<=n)
{
if (fr2[a[dr2]] == 0)
c2++;
fr2[a[dr2]]++;
}
}
if (c2 == u+1)
{
fr2[a[dr2]]--;
dr2--;
c2--;
}
else
dr2--;
}
while (c1<l && dr1!=dr2)
{
dr1++;
if (fr1[a[dr1]] == 0)
c1++;
fr1[a[dr1]]++;
}
}
while ((c1 == l && c2 == u) || (c1 == l && c2 < u && c2 >= l && dr2 == n))
{
st++;
sol += dr2 - dr1 + 1;
fr1[a[st]]--;
fr2[a[st]]--;
if (fr1[a[st]] == 0)
c1--;
}
}
}
}
inline void Write()
{
ofstream g("secv5.out");
g<<sol<<"\n";
g.close();
}
int main()
{
Read();
Solve();
Write();
return 0;
}