Pagini recente » Cod sursa (job #78466) | Cod sursa (job #1400325) | Cod sursa (job #113592) | Cod sursa (job #202201) | Cod sursa (job #432356)
Cod sursa(job #432356)
#include <stdio.h>
#include <vector>
#define Nmax 1048600
#define pb push_back
#define mp make_pair
#define x first
#define nr second
#define UL unsigned long
#define Mod 666013UL
using namespace std;
vector< pair<UL,UL> > G[Mod];
vector< pair<UL,UL> > H[Mod];
UL v[Nmax];
UL n,P,U,i,j; // unsigned long?
UL x,nr,last_nr,ok;
UL sumaU,sumaP;
char s[256];
inline int Find(UL x){
int list=x%Mod;
vector< pair<UL,UL> >:: iterator it;
for(it=G[list].begin(); it!=G[list].end(); ++it)
if(it->x == x){
last_nr=it->nr;
return 1;
}
return -1;
}
inline vector< pair<UL,UL> >::iterator find(UL x){
UL list=x%Mod;
vector< pair<UL,UL> >:: iterator it;
for(it=H[list].begin(); it!=H[list].end(); ++it)
if(it->x==x) return it;
return H[list].end();
}
inline void add(UL x){
vector< pair<UL,UL> >:: iterator it=find(x);
if(it==H[x%Mod].end())
H[x%Mod].pb(mp(x,1));
else it->nr++;
}
inline void sterg(UL x){
vector< pair<UL,UL> >:: iterator it=find(x);
if(it->nr >1) it->nr--;
else H[x%Mod].erase(it), ok=1;
}
void work(UL U, UL& sumaU){
UL i,Lu=1,Lastu=1,nr=0;
for(i=1;i<=n;++i){
if( find(v[i]) == H[v[i]%Mod].end() ){
add(v[i]); nr++;
if( nr > U ){
Lu=Lastu;
ok=0; // tre sa sterg pana cand ajung sa se stearga de tot unul dintre nr
sterg(v[Lu]); // sterg
for(Lu++; !ok ; ){
sterg(v[Lu]);
Lu++;
}
nr--;
}
sumaU+= i-Lu+1;
Lastu=Lu;
}
else{ // era deja
add(v[i]);
sumaU+= i-Lastu+1;
}
}
//for(i=Lu; i<=n; ++i) H[v[i]%Mod].clear();
for(i=0;i<Mod;++i) H[i].clear();
}
int main(){
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
scanf("%lu%lu%lu\n",&n,&P,&U);
for(i=1;i<=n;++i){
//scanf("%lu",&x);
fgets(s,255,stdin); x=0;
for(j=0; s[j]>='0' && s[j]<='9'; ++j)
x=x*10+s[j]-'0';
if(Find(x) == -1){
G[x%Mod].pb(mp(x,++nr));
v[i]=nr;
}
else v[i]=last_nr;
}
sumaU=sumaP=0;
work(U,sumaU);
work(P-1,sumaP);
printf("%lu\n",sumaU-sumaP);
fclose(stdin); fclose(stdout);
return 0;
}