Pagini recente » Cod sursa (job #1626267) | Cod sursa (job #1037781) | Cod sursa (job #1490835) | Cod sursa (job #2881518) | Cod sursa (job #869123)
Cod sursa(job #869123)
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <queue>
#include <deque>
using namespace std;
ifstream f("secv5.in");
ofstream g("secv5.out");
#define nmax ((1<<20)+1)
#define ll long long
int n, L, U, viz[nmax], v[nmax];
pair<int,int> a[nmax];
void citeste(){
f >> n >> L >> U;
int x;
for(int i=1; i<=n; ++i){
f >> x; a[i] = make_pair(x, i);
}
}
inline int afla(int X){
int st = 1; int Distincte = 0; int Cnt = 0;
for(int i=0; i<nmax; ++i) viz[i] = 0;
for(int i=1; i<=n; ++i){
if (viz[ v[i] ] == 0) ++Distincte;
++viz[ v[i] ];
while( st <= i && Distincte > X ){
--viz[ v[st] ];
if (viz[ v[st] ] == 0 ) --Distincte;
++st;
}
Cnt += (i-st+1);
}
return Cnt;
}
void preprocesare(){
sort(a+1, a+n+1);
int poz = 1;
v[ a[1].second ] = poz;
for(int i=2; i<=n; ++i){
if (a[i].first!= a[i-1].first){
++poz; v[ a[i].second ] = poz;
}else v[ a[i].second ] = poz;
}
/*
for(int i=1; i<=n; ++i) cout << v[i] << " ";
cout << "\n";
*/
}
void rezolva(){
// problema devine simpla daca fac urm observatie acele secvente cu numarul elem distincte intre L U sunt secventele cu nr distinte
// cu cel mult U - secventele cu elm distincte cu cel mult L-1;
preprocesare();
cout << afla(U) - afla(L-1);
}
int main(){
citeste();
rezolva();
f.close();
g.close();
return 0;
}