Cod sursa(job #3349484)

Utilizator prares06Papacioc Rares-Ioan prares06 Data 30 martie 2026 15:51:35
Problema Secventa 5 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.62 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<int, int> oldest, newest;
std::vector<int> v;
std::vector<int> dp; //dp[i] = nr de secvente cu proprietatea din enunt terminate in pozitia i
std::deque<int> dq;
int n, l, u;
long long counter;

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

    v.resize(n);
    dp.resize(n);
    
    for(int i = 0; i < n; ++i){
        fin >> v[i];
        if(oldest.find(v[i]) != oldest.end()){
            newest[v[i]] = i;
            if((int)oldest.size() >= l){
                int t = (int)oldest.size() - l;
                dp[i] = newest[dq[t]] - oldest[dq[0]] + 1; 
            }
        }
        else{
            if((int)oldest.size() < u){
                oldest[v[i]] = newest[v[i]] = i;
                dq.push_back(v[i]); 
                if((int)oldest.size() >= l){
                    int t = (int)oldest.size() - l;
                    dp[i] = newest[dq[t]] - oldest[dq[0]] + 1;
                }
            }
            else{
                int 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 = (int)oldest.size() - l;
                dp[i] = newest[dq[t]] - oldest[dq[0]] + 1; 
            }
        }
    }

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