Pagini recente » Cod sursa (job #2433226) | Cod sursa (job #2471456) | Cod sursa (job #2047386) | Cod sursa (job #1711850) | Cod sursa (job #728931)
Cod sursa(job #728931)
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <iostream>
#define nmax (1<<20)+1
using namespace std;
vector <pair<unsigned,unsigned > > v;//tine datele initiale
unsigned f[nmax];//tine numarul de aparitii ale fiecarui numar pana acum
unsigned normalizat[nmax];
unsigned norm=0;
int n;
long long secv(unsigned x){//returneaza numarul de secvente care au numarul de elem diferite<=x
if(x==0)return 0;
memset(f,0,nmax*4);//setez frecventa pe 0
long long secv=0;
int inceput=0;
int i;
long long dif=0;
for(i=0;i<n;i++){
if(!f[normalizat[i]])//daca nu mai aveam tipul asta de element
dif++;
f[normalizat[i]]++;
//verific nr de diferente
while(dif>x){
f[normalizat[inceput]]--;
if(f[normalizat[inceput]]==0){
dif--;
}
inceput++;
}
secv+=i-inceput+1;
}
return secv;
}
int main(){
ifstream fin("secv5.in");
ofstream fout("secv5.out");
unsigned li,ls;
unsigned i;
unsigned aux;
fin>>n>>li>>ls;
for(i=0;i<n;i++){
fin>>aux;
v.push_back(make_pair(aux,i));
}
sort(v.begin(),v.end());
//am sortat dupa primul cap
aux=v[0].first;
normalizat[v[0].second]=norm;
for(vector<pair<unsigned,unsigned> >::iterator it=v.begin()+1;it<v.end();it++){
if(aux!=(*it).first){
aux=(*it).first;
norm++;
}
normalizat[(*it).second]=norm;
}
//pana acum am normalizat
//cout<<secv(ls)<<" "<<secv(li-1)<<endl;
fout<<secv(ls)-secv(li-1)<<endl;
return 0;
}