Pagini recente » Monitorul de evaluare | Atasamentele paginii Trans | Cod sursa (job #3355680)
#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;
}