Pagini recente » Istoria paginii runda/lasm06.03.2017/clasament | Cod sursa (job #1356520) | Cod sursa (job #1640091) | Cod sursa (job #1753249) | Cod sursa (job #1189062)
#include<cstdio>
const int N=1<<20,K=666013;
class Hash{
public:
unsigned int list[K+1],val[N+1],next[N+1];
unsigned int nr;
void push(unsigned int x){
unsigned int r=x%K;
this->val[++this->nr]=x;
this->next[nr]=this->list[r];
this->list[r]=this->nr;
}
void pop(unsigned int x){
unsigned int r=x%K,p;
if(x==val[list[r]])
list[r]=next[list[r]];
else{
p=list[r];
while(next[p]!=0&&val[next[p]]!=x)
p=next[p];
next[p]=next[next[p]];
}
}
bool belong(unsigned int x){
unsigned int p=list[x%K];
while(p!=0&&val[p]!=x)
p=next[p];
return p!=0;
}
};
Hash hL,hR;
unsigned int v[N+1];
FILE*in,*out;
int n,low,up;
void scan(){
int i;
fscanf(in,"%d%d%d",&n,&low,&up);
for(i=1;i<=n;i++)
fscanf(in,"%u",&v[i]);
}
void init(){
in=fopen("secv5.in","r");
out=fopen("secv5.out","w");
scan();
}
void solve(){
int i=1,left=0,right=0,diffL=0,diffR=0,res=0;
while(true){
left++;
if(left==n+1)
break;
if(!hL.belong(v[left]))
diffL++;
hL.push(v[left]);
if(diffL==low+1)
break;
}
diffL--;
hL.pop(v[left]);
left--;
while(true){
right++;
if(right==n+1)
break;
if(!hR.belong(v[right]))
diffR++;
hR.push(v[right]);
if(diffR==up+1)
break;
}
diffR--;
hR.pop(v[right]);
right--;
while(i<=n-low+1){
res+=(right-left+1);
hL.pop(v[i]);
hR.pop(v[i]);
if(!hL.belong(v[i])){
diffL--;
while(true){
left++;
if(left==n+1)
break;
if(!hL.belong(v[left]))
diffL++;
hL.push(v[left]);
if(diffL==low+1)
break;
}
diffL--;
hL.pop(v[left]);
left--;
}
if(!hR.belong(v[i])){
diffR--;
while(true){
right++;
if(right==n+1)
break;
if(!hR.belong(v[right]))
diffR++;
hR.push(v[right]);
if(diffR==up+1)
break;
}
diffR--;
hR.pop(v[right]);
right--;
}
i++;
}
fprintf(out,"%d",res);
}
int main(){
init();
solve();
return 0;
}