Pagini recente » Cod sursa (job #2362373) | Cod sursa (job #2361208) | Cod sursa (job #1263875) | Cod sursa (job #198688) | Cod sursa (job #2881418)
#include <iostream>
#include <fstream>
#include <cstdio>
#include <unordered_map>
using namespace std;
class InParser {
private:
static const int BUFF_SIZE = 1 << 17;
int cursor;
char buff[BUFF_SIZE];
FILE *in_file;
char get_char() {
if(cursor == BUFF_SIZE) {
fread(buff, sizeof(buff[0]), BUFF_SIZE, in_file);
cursor = 0;
}
return buff[cursor++];
}
public:
InParser(const char *filename) {
in_file = fopen(filename, "r");
cursor = BUFF_SIZE;
}
InParser & operator >> (int &nr) {
char ch = get_char();
while(ch < '0' || ch > '9') ch = get_char();
nr = 0;
while(ch >= '0' && ch <= '9') {
nr = nr * 10 + ch - '0';
ch = get_char();
}
return *this;
}
};
const int NMAX = (1 << 20);
int n, l, u;
int v[NMAX + 5];
int aparitii[NMAX + 5];
unordered_map<int, int> normalizare;
long long count_subsecv(int max_ap) {
for(int i = 1; i <= n; i++)
aparitii[ v[i] ] = 0;
long long nr_secv = 0;
int st = 1, dr = 0;
int nr_distincte = 0; // cate nr distincte am in secventa curenta
while(st <= n) {
// Verific daca pot extinde
if(dr < n && (st > dr || nr_distincte <= max_ap)) {
aparitii[ v[++dr] ]++;
if(aparitii[ v[dr] ] == 1)
nr_distincte++;
}
else {
aparitii[ v[st] ]--;
if(aparitii[ v[st] ] == 0)
nr_distincte--;
st++;
}
// Verific daca secventa curenta e buna
if(st <= dr && nr_distincte <= max_ap) {
nr_secv += (dr - st + 1);
if(dr == n)
break;
}
}
return nr_secv;
}
int main() {
// freopen("secv5.in", "r", stdin);
freopen("secv5.out", "w", stdout);
// ifstream fin("secv5.in");
// ofstream fout("secv5.out");
InParser in("secv5.in");
int nr_dist = 0;
in >> n >> l >> u;
for(int i = 1; i <= n; i++) {
in >> v[i];
if(normalizare.find(v[i]) == normalizare.end())
normalizare[ v[i] ] = ++nr_dist;
v[i] = normalizare[ v[i] ];
}
cout << (count_subsecv(u) - count_subsecv(l - 1));
return 0;
}