Cod sursa(job #2467514)

Utilizator MateiAruxandeiMateiStefan MateiAruxandei Data 4 octombrie 2019 16:00:58
Problema Secventa 5 Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.94 kb
#include <cstdio>
#include <unordered_map>
#include <fstream>

#define BUFFSIZE 65536
using namespace std;

unordered_map<unsigned int, unsigned int> fr;
unsigned int v[(1 << 20) + 100], n, l, u;

long long getNrSec(unsigned int nrD)
{
    for(int i = 1; i <= n; ++i)
        fr[v[i]] = 0;
    unsigned int p1 = 1, p2 = 1, cnt = 0;
    bool ok = 1, enter = 0;
    long long rez = 0;
    while(p2 <= n)
    {
        if(fr[v[p2]] == 0 && ok)
        {
            cnt++;
            enter = 1;
            fr[v[p2]] = 1;
        }

        if(!enter)
        fr[v[p2]]++;

            if(cnt <= nrD)
        {
            ok = 1;
            rez += (p2 - p1 + 1);
                ++p2;
                enter = 0;
            }
            else
            {
                fr[v[p1]]--;
                if(fr[v[p1]] == 0)
                    --cnt;
                ++p1;
                ok = 0;
                enter = 1;
            }
    }
    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;
}