Cod sursa(job #2885064)

Utilizator StanCatalinStanCatalin StanCatalin Data 5 aprilie 2022 14:53:26
Problema Secventa 5 Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <iostream>
#include <fstream>
#include <unordered_map>
#include <vector>

using namespace std;

class InParser {

private:

	FILE *fin;

	char *buff;

	int sp;



	char read_ch() {

		++sp;

		if (sp == 4096) {

			sp = 0;

			fread(buff, 1, 4096, fin);

		}

		return buff[sp];

	}



public:

	InParser(const char* nume) {

		fin = fopen(nume, "r");

		buff = new char[4096]();

		sp = 4095;

	}



	InParser& operator >> (int &n) {

		char c;

		while (!isdigit(c = read_ch()) && c != '-');

		int sgn = 1;

		if (c == '-') {

			n = 0;

			sgn = -1;

		} else {

			n = c - '0';

		}

		while (isdigit(c = read_ch())) {

			n = 10 * n + c - '0';

		}

		n *= sgn;

		return *this;

	}



	InParser& operator >> (unsigned long long int &n) {

		char c;

		n = 0;

		while (!isdigit(c = read_ch()) && c != '-');

		long long sgn = 1;

		if (c == '-') {

			n = 0;

			sgn = -1;

		} else {

			n = c - '0';

		}

		while (isdigit(c = read_ch())) {

			n = 10 * n + c - '0';

		}

		n *= sgn;

		return *this;

	}

};
ofstream out("secv5.out");

int n, l, u;
unordered_map<unsigned int, unsigned int> mp_u;
unordered_map<unsigned int, unsigned int> mp_l;
unordered_map<unsigned int, unsigned int> elem;

int main()
{

    InParser fin("secv5.in");
    unsigned long long int x;
    fin >> n >> l >> u;
    unsigned long long int calcul_u = 0;
    unsigned long long int calcul_l = 0;
    unsigned long long int j = 1;
    unsigned long long int k = 1;
    for (unsigned long long int i=1; i<=n; i++) {
            fin >> x;
            elem[i] = x;
            mp_u[x] ++;
            if (mp_u.size() > u) {
                    while (mp_u.size() > u) {
                        mp_u[elem[j]]--;
                        if (mp_u[elem[j]] == 0) {
                            mp_u.erase(elem[j]);
                        }
                        j++;
                    }
            }
            calcul_u += (i - j + 1);

            mp_l[x] ++;
            if (mp_l.size() >= l) {
                    while (mp_l.size() >= l) {
                        mp_l[elem[k]]--;
                        if (mp_l[elem[k]] == 0) {
                            mp_l.erase(elem[k]);
                        }
                        k++;
                    }
            }
            calcul_l += (i - k + 1);
    }
    out << calcul_u - calcul_l;
    return 0;
}