Pagini recente » Cod sursa (job #1124458) | Cod sursa (job #1877910) | Cod sursa (job #2976269) | Cod sursa (job #2180062) | Cod sursa (job #2612327)
#include <fstream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 1050000;
unsigned int n, L, U;
FILE *fin = fopen("secv5.in", "r");
int cursor = 0;
const int DIM = (1<<21);
char buf[DIM];
void adv()
{
if (__builtin_expect(++cursor == DIM, 0)) {
cursor = 0;
fread(buf, DIM, 1, fin);
}
}
void readUnsigned(unsigned int &nr)
{
for (; buf[cursor] < '0'; adv());
for (nr = 0; buf[cursor] >= '0' && buf[cursor] <= '9'; adv())
nr = nr*10 + buf[cursor] - '0';
}
struct Elem
{
unsigned int val;
int pos;
};
Elem elements[MAXN];
unsigned int norm[MAXN];
unsigned int m[MAXN];
bool cmp(Elem e, Elem f)
{
return e.val < f.val;
}
long long compute(unsigned int x)
{
for (unsigned int i = 0; i < n; i++) m[i] = 0;
unsigned int st = 0;
long long sol = 0;
unsigned int msize = 0;
for (unsigned int dr = 0; dr < n; dr++) {
if (m[norm[dr]] == 0)
msize++;
++m[norm[dr]];
while (msize > x) {
m[norm[st]]--;
if (m[norm[st]] == 0)
msize--;
++st;
}
sol += dr - st +1;
}
return sol;
}
int main()
{
ofstream fout("secv5.out");
fread(buf, DIM, 1, fin);
readUnsigned(n);
readUnsigned(L);
readUnsigned(U);
for (unsigned int i = 0; i < n; i++) {
readUnsigned(elements[i].val);
elements[i].pos = i;
}
sort(elements, elements+n, cmp);
for (unsigned int i = 1; i < n; i++)
norm[elements[i].pos] = norm[elements[i-1].pos] + (elements[i].val != elements[i-1].val);
long long rez = compute(U) - compute(L-1);
fout << rez;
return 0;
}