Cod sursa(job #2588930)

Utilizator minecraft3Vintila Valentin Ioan minecraft3 Data 25 martie 2020 16:26:44
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.51 kb
#include <bits/stdc++.h>

using namespace std;

#define N ((1 << 20) + 5)
#define DIMBUFF 100005

long long n;
long long v[N];

unordered_map<long long, int> A;
	
FILE *fin =  fopen ("secv5.in", "r");
char buff[DIMBUFF];
int pp;
int numar() {
    int val = 0;
    while (!(buff[pp] >= '0' && buff[pp] <= '9')) {
        pp++;
        if (pp == DIMBUFF) {
            fread(buff, 1, DIMBUFF, fin);
            pp=0;
        }
    }
	
    while (buff[pp] >= '0' && buff[pp] <= '9') {
        val = val*10 + buff[pp] - '0';
        pp++;
        if (pp == DIMBUFF) {
            fread(buff, 1, DIMBUFF, fin);
            pp=0;
        }
    }
    return val;
}

const long long solve(int k) {
    long long i = 1, j = 0, nrdif = 0, rez = 0;
    while(++j <= n) {
        if((++A[v[j]]) == 1) ++nrdif;
        if(nrdif > k) {
            rez += (long long)(j-i) * (long long)(j-i+1) / 2ll;
            do {
                if(!(--A[v[i]])) {
                    --nrdif;
                    A.erase(v[i]);
                }
                ++i;
            } while(nrdif > k);
            rez -= (long long)(j-i) * (long long)(j-i+1) / 2ll;
        }
    }
    rez += (long long)(j-i) * (long long)(j-i+1) / 2ll;
    A.clear();

    /*for(int i = 1; i <= 5; ++i)
        cout << A[i] << ' ';
    cout << endl << rez << endl;*/
    return rez;
}

int main() {
    ofstream fout("secv5.out");

    int p, q;
    n = numar(); p = numar(); q = numar();
    for(int i = 1; i <= n; ++i)
        v[i] = numar();
        
    fout << solve(q) - solve(p-1);
}