Pagini recente » Cod sursa (job #2012886) | Cod sursa (job #2367872) | Cod sursa (job #1183134) | Cod sursa (job #426083) | Cod sursa (job #812506)
Cod sursa(job #812506)
#include <fstream>
using namespace std;
#include <vector>
ifstream f("secv5.in");
ofstream g("secv5.out");
#define MOD 666013
#define LE 1060000
vector<pair<int,int> > H[MOD];
int i,j,stanga[LE],dreapta[LE],a[LE];
int mind,maxD,E;
int st;
int nrdist;
int n;
void update(int value,int semn)
{
int R=value%MOD;
int N=H[R].size();
for(int i=0;i<N;++i)
if (H[R][i].first==value)
{
H[R][i].second+=semn;
return;
}
H[R].push_back(make_pair(value,1));
}
int query(int value)
{
int R=value%MOD;
int N=H[R].size();
for(int i=0;i<N;++i)
if (H[R][i].first==value)
return H[R][i].second;
return 0;
}
#define ll long long
int main()
{
f>>n>>mind>>maxD;
for(i=1;i<=n;++i)
f>>a[i];
st=1;
update(a[1],1);
E=maxD;
nrdist=1;
stanga[1]=1;
if (mind>1)
stanga[1]=-1;
for(i=2; i<=n; ++i)
{
if (query(a[i])==0)
++nrdist;
update(a[i],1);
while (nrdist>E)
{
update(a[st],-1);
if (query(a[st])==0)
--nrdist;
++st;
}
stanga[i]=st;
if (st==1&&nrdist<mind)
stanga[i]=-1;
}
for(i=1; i<MOD; ++i)
H[i].clear();
E=mind;
nrdist=1;
st=1;
dreapta[1]=1;
update(a[1],1);
for(i=2; i<=n; ++i)
{
if (query(a[i])==0)
++nrdist;
update(a[i],1);
while (nrdist>=E)
{
update(a[st],-1);
if (query(a[st])==0)
--nrdist;
if (nrdist<E)
{
update(a[st],1);
++nrdist;
break;
}
++st;
}
dreapta[i]=st;
}
ll nu=0;
for(i=1;i<=n;++i) if (stanga[i]!=-1)
nu+=(dreapta[i]-stanga[i]+1);
g<<nu<<'\n';
f.close();
g.close();
return 0;
}