Cod sursa(job #2588920)

Utilizator minecraft3Vintila Valentin Ioan minecraft3 Data 25 martie 2020 16:23:00
Problema Secventa 5 Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.48 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]]) ++nrdif;
        ++A[v[j]];
        
        if(nrdif > k) {
            rez += (long long)(j-i) * (long long)(j-i+1) / 2ll;
            do {
                if(!(--A[v[i]])) --nrdif;
                ++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;
    while(i <= n) A[v[i]] = 0, ++i;

    /*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);
}