Cod sursa(job #3349486)

Utilizator prares06Papacioc Rares-Ioan prares06 Data 30 martie 2026 15:54:05
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.72 kb
#include <fstream>
#include <unordered_set>
#include <unordered_map>
#include <vector>
#include <set>
#include <deque>

std::ifstream fin("secv5.in");
std::ofstream fout("secv5.out");

std::unordered_map<long long, long long> oldest, newest;
std::vector<long long> v;
std::vector<long long> dp; //dp[i] = nr de secvente cu proprietatea din enunt terminate in pozitia i
std::deque<long long> dq;
long long n, l, u;
long long counter;

int main(){
    fin >> n >> l >> u;

    v.resize(n);
    dp.resize(n);
    
    for(long long i = 0; i < n; ++i){
        fin >> v[i];
        if(oldest.find(v[i]) != oldest.end()){
            newest[v[i]] = i;
            if((long long)oldest.size() >= l){
                long long t = (long long)oldest.size() - l;
                dp[i] = newest[dq[t]] - oldest[dq[0]] + 1; 
            }
        }
        else{
            if((long long)oldest.size() < u){
                oldest[v[i]] = newest[v[i]] = i;
                dq.push_back(v[i]); 
                if((long long)oldest.size() >= l){
                    long long t = (long long)oldest.size() - l;
                    dp[i] = newest[dq[t]] - oldest[dq[0]] + 1;
                }
            }
            else{
                long long t = dq.front();
                dq.pop_front();
                oldest.erase(oldest.find(t));
                newest.erase(newest.find(t));
                oldest[v[i]] = newest[v[i]] = i;
                dq.push_back(v[i]);
                t = (long long)oldest.size() - l;
                dp[i] = newest[dq[t]] - oldest[dq[0]] + 1; 
            }
        }
    }

    for(long long i = 0; i < n; ++i){
        counter += (long long)dp[i];
    }
    fout << counter;
}