Cod sursa(job #2863643)

Utilizator cdenisCovei Denis cdenis Data 7 martie 2022 00:42:46
Problema Secventa 5 Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <fstream>
#include <unordered_map>
#include <stdio.h>
#include <ctype.h>

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()));
		n = c - '0';
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		return *this;
	}

	InParser& operator >> (unsigned int &n) {
		char c;
		while (!isdigit(c = read_ch()));
		n = c - '0';
		while (isdigit(c = read_ch())) {
			n = 10 * n + c - '0';
		}
		return *this;
	}
};

using namespace std;

int n,l,u,nr;
unsigned int v[1<<20+1];
unordered_map < unsigned int , int > ap,f;

long long secv(int k)
{
    ap.clear();
    long long st=1,cnt=0,kk=k+1;
    for(int dr=1;dr<=n;++dr)
    {
        ap[v[dr]]++;
        if(ap.size()==kk)
        {
            int sz=ap.size();
            while(sz==kk)
            {
                ap[v[st]]--;
                if(ap[v[st]]==0)
                {
                    sz--;
                    ap.erase(v[st]);
                }
                st++;
            }
        }
        cnt+=dr-st+1;
    }
    return cnt;
}

int main()
{
    InParser fin("secv5.in");
    ofstream fout("secv5.out");
    fin >> n >> l >> u;
    for(int i=1;i<=n;++i)
    {
        fin >> v[i];
        if (!f[v[i]])
        {
            f[v[i]]=++nr;
            v[i]=nr;
        }
        else
            v[i]=f[v[i]];
    }
    fout << secv(u)-secv(l-1);
	return 0;
}