Pagini recente » Cod sursa (job #1360930) | Cod sursa (job #235875) | Cod sursa (job #2671928) | Cod sursa (job #2949571) | Cod sursa (job #775678)
Cod sursa(job #775678)
#include <cstring>
#include <fstream>
#include <algorithm>
#include <vector>
using namespace std;
ifstream fin("secv5.in");
ofstream fout("secv5.out");
const int MOD = 10007;
vector<pair<unsigned, int> > V[MOD];
int valnow = 0;
int add(unsigned val)
{
int vmod = val % MOD;
for (vector<pair<unsigned, int> >::iterator it = V[vmod].begin(); it != V[vmod].end(); ++it)
if (it->first == val)
return it->second;
V[vmod].push_back(make_pair(val, ++valnow));
return valnow;
}
char parse[1 << 16];
int pnow;
inline void verify()
{
if (parse[pnow] == 0)
{
fin.get(parse, 1 << 16, '\0');
pnow = 0;
}
}
unsigned get()
{
while (!(parse[pnow] >= '0' && parse[pnow] <= '9'))
{
++pnow;
verify();
}
unsigned number = 0;
while (parse[pnow] >= '0' && parse[pnow] <= '9')
{
number = number * 10 + (parse[pnow] - '0');
++pnow;
verify();
}
return number;
}
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()
{
verify();
N = get(), L = get(), U = get();
for (int i = 1; i <= N; ++i)
{
A[i] = get();
A[i] = add(A[i]);
}
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();
}