Pagini recente » Cod sursa (job #2810120) | Cod sursa (job #2290452) | Cod sursa (job #1764922) | Cod sursa (job #2169112) | Cod sursa (job #775661)
Cod sursa(job #775661)
#include <cstring>
#include <fstream>
#include <algorithm>
using namespace std;
int N, L, U;
unsigned A[(1 << 20) + 2];
int pos[(1 << 20) + 2];
int freq[(1 << 20) + 2];
class compare
{
public: inline bool operator () (const int& i1, const int& i2)
{
return A[i1] < A[i2];
}
};
long long getS(int x)
{
memset(freq, 0, sizeof(freq));
int now = 1, different = 0;
long long result = 0;
for (int i = 1; i <= N; ++i)
{
while (now <= N && different + (freq[A[now]] == 0) <= x)
{
different += (freq[A[now]] == 0);
++freq[A[now]];
++now;
}
result += (now - i + 1);
--freq[A[i]];
if (freq[A[i]] == 0)
--different;
}
return result;
}
int main()
{
ifstream fin("secv5.in");
ofstream fout("secv5.out");
fin >> N >> L >> U;
for (int i = 1; i <= N; ++i)
{
fin >> A[i];
pos[i] = i;
}
sort(pos + 1, pos + N + 1, compare());
int now = 0;
for (int i = 1; i <= N; ++i)
{
++now;
while (i < N && A[pos[i]] == A[pos[i + 1]])
{
A[pos[i]] = now;
++i;
}
A[pos[i]] = now;
}
fout << getS(U) - getS(L - 1) << '\n';
fin.close();
fout.close();
}