Pagini recente » Cod sursa (job #1911616) | Cod sursa (job #1335499) | Cod sursa (job #188912) | Cod sursa (job #2368774) | Cod sursa (job #432737)
Cod sursa(job #432737)
#include <fstream>
#include <vector>
using namespace std;
typedef unsigned int uint;
const uint MOD=666013;
const int NMAX=1<<20;
#define ff first
#define ss second
#define mp make_pair
#define pb push_back
vector< pair<uint,int> > Hp[MOD],Hq[MOD];
int N,L,U;
uint x[NMAX];
int add(uint x,vector< pair<uint,int> > H[])
{
int w=x%MOD;
vector< pair<uint,int> >::iterator it;
for (it=H[w].begin();it!=H[w].end();++it)
if (it->ff == x)
{
++it->ss;
return 0;
}
H[w].pb(mp(x,1));
return 1;
}
int erase(uint x,vector< pair<uint,int> > H[])
{
int w=x%MOD;
vector< pair<uint,int> >::iterator it;
for (it=H[w].begin();it!=H[w].end();++it)
if (it->ff == x)
{
--it->ss;
if (it->ss ==0)
{
H[w].erase(it);
return 1;
}
else return 0;
}
return -1;
}
int main()
{
ifstream fin("secv5.in");
int i,p=0,q=0,np=0,nq=0;
fin>>N>>L>>U;
for (i=0;i<N;++i) fin>>x[i];
long long sol=0;
for (i=0;i<N;++i)
{
np+=add(x[i],Hp);
nq+=add(x[i],Hq);
if (np < L) continue;
while (nq >= L)
if (erase(x[q++],Hq) == 1) --nq;
while (np > U)
if (erase(x[p++],Hp) == 1) --np;
sol+=q-p;
}
ofstream fout("secv5.out");
fout<<sol;
return 0;
}