Pagini recente » Cod sursa (job #1280887) | Cod sursa (job #697367) | Cod sursa (job #714902) | Cod sursa (job #910515) | Cod sursa (job #2467528)
#include <cstdio>
#include <unordered_map>
#include <fstream>
#define BUFFSIZE 655536
using namespace std;
unordered_map<unsigned int, int> fr;
unsigned int v[(1 << 20) + 100], n, l, u;
long long getNrSec(unsigned int nrD)
{
fr.clear();
unsigned int p1 = 1, p2 = 1;
long long rez = 0;
while(p2 <= n)
{
while(p2 <= n)
{
fr[v[p2]]++;
if(fr.size() > nrD)
break;
rez += (p2 - p1 + 1);
++p2;
}
while(fr.size() > nrD && p1 <= p2)
{
fr[v[p1]]--;
if(fr[v[p1]] == 0)
fr.erase(v[p1]);
++p1;
}
fr[v[p2]]--;
}
return rez;
}
class InParser
{
private:
int pz;
char *buffer;
FILE *fin;
char get_char()
{
++pz;
if(pz == BUFFSIZE)
{
fread(buffer, 1, BUFFSIZE, fin);
pz = 0;
}
return buffer[pz];
}
public:
InParser(const char *nume)
{
fin = fopen(nume, "r");
buffer = new char[BUFFSIZE]();
pz = BUFFSIZE - 1;
}
InParser& operator>>(unsigned int &val)
{
val = 0;
char c = get_char();
while(isdigit(c))
{
val = val * 10 + (c - '0');
c = get_char();
}
return *this;
}
};
InParser fin("secv5.in");
ofstream fout("secv5.out");
int main()
{
fin >> n >> l >> u;
for(int i = 1; i <= n; ++i)
fin >> v[i];
if(l == 1)
fout << getNrSec(u) << '\n';
else fout << getNrSec(u) - getNrSec(l - 1) << '\n';
return 0;
}