Pagini recente » Cod sursa (job #1983774) | Cod sursa (job #1244039) | Istoria paginii runda/c3 | Cod sursa (job #183871) | Cod sursa (job #1856348)
#include<fstream>
#include<algorithm>
using namespace std;
const int NMAX = 1100000;
bool cmp(int *a, int *b){
if(*a < *b)
return 1;
return 0;
}
int n, l, u, v[NMAX], *poz[NMAX], hs1[NMAX], hs2[NMAX];
int main(){
ifstream fin("secv5.in");
ofstream fout("secv5.out");
fin >> n >> l >> u;
for(int i = 1; i <= n; i++){
fin >> v[i];
poz[i] = &v[i];
}
poz[n + 1] = &v[0];
sort(poz + 1, poz + n + 1, cmp);
int last = *poz[1], crnt = 1;
*poz[1] = crnt;
for(int i = 2; i <= n; i++){
if(*poz[i] != last){
crnt++;
last = *poz[i];
}
*poz[i] = crnt;
}
int st1, st2, dr, cnt1 = 0, cnt2 = 0; //st1 for l, st2 for u
long long qqq = 0;
for(st1 = 1, st2 = 1, dr = 1; dr <= n; dr++){
if(hs1[v[dr]] == 0)
cnt1++;
hs1[v[dr]]++;
while(cnt1 >= l && st1 <= dr){
if(hs1[v[st1]] == 1){
cnt1--;
}
hs1[v[st1]]--;
st1++;
}
////////
if(hs2[v[dr]] == 0)
cnt2++;
hs2[v[dr]]++;
while(cnt2 > u && st2 <= dr){
if(hs2[v[st2]] == 1){
cnt2--;
}
hs2[v[st2]]--;
st2++;
}
////
if(cnt2 >= l)
qqq += st1 - st2;
}
fout << qqq;
return 0;
}