Pagini recente » Rating Lapadus Daria (daria_lapadus) | Cod sursa (job #1101964) | Cod sursa (job #2782076) | Cod sursa (job #197963) | Cod sursa (job #728938)
Cod sursa(job #728938)
#include <fstream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <iostream>
#define nmax (1<<20)+1
#define MAXIM 1000000
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;
unsigned n;
char buff[MAXIM+2];
int poz=MAXIM-1;
inline void cit(unsigned &nr){
while(buff[poz]<'0' || buff[poz]>'9'){//nu e cifra
poz++;
if(poz==MAXIM){
fread(buff,1,MAXIM,stdin);
poz=0;
}
}
nr=0;
while(buff[poz]>='0' && buff[poz]<='9'){
nr=nr*10+buff[poz]-'0';
poz++;
if(poz==MAXIM){
fread(buff,1,MAXIM,stdin);
poz=0;
}
}
}
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(){
freopen ("secv5.in","r",stdin);
ofstream fout("secv5.out");
unsigned li,ls;
unsigned i;
unsigned aux;
//fin>>n>>li>>ls;
cit(n);
cit(li);
cit(ls);
for(i=0;i<n;i++){
//fin>>aux;
cit(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;
}