Pagini recente » Cod sursa (job #132978) | Cod sursa (job #1650395) | Cod sursa (job #1014497) | Cod sursa (job #1952949) | Cod sursa (job #793385)
Cod sursa(job #793385)
#include <fstream>
#include <vector>
using namespace std;
ifstream in("secv5.in");
ofstream out("secv5.out");
const int HASH=666013;
const int N=1<<20;
vector< pair<int,int> > hash[HASH];
int n,mindif,maxdif,dif=0,result=0;
int v[N];
bool insert_hash(int x){
int hash_code=x%HASH;
for(int i=0;i<hash[hash_code].size();++i){
if(hash[hash_code][i].first==x){
hash[hash_code][i].second++;
return true;
}
}
dif++;
hash[hash_code].push_back(make_pair(x,0));
return true;
}
bool remove_hash(int x){
int hash_code=x%HASH;
vector<pair<int,int> >::iterator it;
for(it=hash[hash_code].begin();it<hash[hash_code].end();++it){
if((*it).first==x){
if((*it).second==1){
hash[hash_code].erase(it);
dif--;
return true;
}
(*it).second--;
return true;
}
}
return false;
}
bool find_hash(int x){
int hash_code=x%HASH;
for(int i=0;i<hash[hash_code].size();++i){
if(hash[hash_code][i].first==x){
return true;
}
}
return false;
}
void solve(){
int start=1,stop=1,beg,end;
while(start<=n-mindif){
if(dif<mindif){
while(dif+find_hash(v[stop])<=mindif && stop<=n){
insert_hash(v[stop]);
stop++;
if(dif==mindif){
beg=stop-1;
break;
}
}
}
if(stop==n && dif<mindif){
return;
}
while(dif+find_hash(v[stop])<=maxdif && stop<=n){
insert_hash(v[stop]);
stop++;
}
end=stop-1;
result+=(end-beg+1);
remove_hash(v[start]);
start++;
}
}
int main(){
in>>n>>mindif>>maxdif;
for(int i=1;i<=n;++i){
in>>v[i];
}
solve();
out<<result;
return 0;
}