Pagini recente » Cod sursa (job #2962815) | Cod sursa (job #2569977) | Cod sursa (job #1214473) | Cod sursa (job #3224479) | Cod sursa (job #634426)
Cod sursa(job #634426)
#include<fstream>
#include<vector>
#include<algorithm>
#include<utility>
#define M 666013
#define NMAX 1050000
using namespace std;
vector<pair<int,int> >H1[666014],H2[666013];
int a[NMAX],n,S=0,u,l,up,low;
void sterge1(int x)
{
int k=-1,key=x%M;
for(int i=0;i<H1[key].size();i++)
{
if(H1[key][i].first==x)
{
k=i;
break;
}
}
int i=H1[key].size();
if(k!=-1 and H1[key][k].second==1) { swap(H1[key][k],H1[key][i-1]); H1[key].pop_back(); } else
if(k!=-1) H1[key][k].second--;
}
void sterge2(int x)
{
int k=-1,key=x%M;
for(int i=0;i<H2[key].size();i++)
{
if(H2[key][i].first==x)
{
k=i;
break;
}
}
int i=H2[key].size();
if(k!=-1 and H2[key][k].second==1) { swap(H2[key][k],H2[key][i-1]); H2[key].pop_back(); } else
if(k!=-1) H2[key][k].second--;
}
bool caut1(int x)
{
int key=x%M;
for(int i=0;i<H1[key].size();i++)
if(H1[key][i].first==x) return 0;
return 1;
}
bool caut2(int x)
{
int key=x%M;
for(int i=0;i<H2[key].size();i++)
if(H2[key][i].first==x) return 0;
return 1;
}
void add1(int x)
{
int key=x%M,k=0;
for(int i=0;i<H1[key].size();i++)
if(H1[key][i].first==x) {
H1[key][i].second++;
return;
}
H1[key].push_back(make_pair(x,1));
}
void add2(int x)
{
int key=x%M,k=0;
for(int i=0;i<H2[key].size();i++)
if(H2[key][i].first==x) {
H2[key][i].second++;
return;
}
H2[key].push_back(make_pair(x,1));
}
int main()
{
int dist1=0,dist2=0,i,x;
ifstream fi("secv5.in");
ofstream fo("secv5.out");
fi>>n>>l>>u;
low=up=1;
for(i=1;i<=n;i++)
{
fi>>x; a[i]=x;
dist1=dist1+caut1(x);
dist2=dist2+caut2(x);
add1(x); add2(x);
for( ;dist1>u;low++)
{
sterge1(a[low]);
if(caut1(a[low])) dist1--;
}
for( ;dist2>l or a[up+1]==a[up];up++)
{
sterge2(a[up]);
if(caut2(a[up])) dist2--;
}
if(l<=dist2)
S+=up-low+1;
}
fo<<S<<"\n";
return 0;
}