Cod sursa(job #3355680)

Utilizator darius_cimbruDarius Cimbru darius_cimbru Data 24 mai 2026 20:26:33
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.34 kb
#include <bits/stdc++.h>
#include <fstream>
using namespace std;

// caut cate subsecvente au intre L si U distincte = (cate au <= U) - (cate au <= L-1)
// fac sliding window cu un counter pe valori, distincte creste cand gasesc valoare noua

unsigned int a[1<<20];
int idx_a[1<<20];
int cnt1[1<<20], cnt2[1<<20];

int main(){
    ifstream fin("secv5.in");
    ofstream fout("secv5.out");
    int n, L, U;
    fin>>n>>L>>U;
    for(int i=0;i<n;i++) fin>>a[i];

    vector<unsigned int> sortat(a, a+n);
    sort(sortat.begin(), sortat.end());
    sortat.erase(unique(sortat.begin(), sortat.end()), sortat.end());
    for(int i=0;i<n;i++)
        idx_a[i] = lower_bound(sortat.begin(), sortat.end(), a[i]) - sortat.begin();

    int st1=0, dist1=0;
    long long rez1=0;
    for(int dr=0;dr<n;dr++){
        if(cnt1[idx_a[dr]]==0) dist1++;
        cnt1[idx_a[dr]]++;
        while(dist1>U){
            cnt1[idx_a[st1]]--;
            if(cnt1[idx_a[st1]]==0) dist1--;
            st1++;
        }
        rez1+=dr-st1+1;
    }

    int st2=0, dist2=0;
    long long rez2=0;
    for(int dr=0;dr<n;dr++){
        if(cnt2[idx_a[dr]]==0) dist2++;
        cnt2[idx_a[dr]]++;
        while(dist2>L-1){
            cnt2[idx_a[st2]]--;
            if(cnt2[idx_a[st2]]==0) dist2--;
            st2++;
        }
        rez2+=dr-st2+1;
    }

    fout<<rez1-rez2<<"\n";
    return 0;
}