Pagini recente » Cod sursa (job #557238) | Cod sursa (job #1034437) | Cod sursa (job #2627706) | Cod sursa (job #1487009) | Cod sursa (job #2149749)
#include<fstream>
#include<vector>
#define M 66013
#include<iostream>
#define pb push_back
#define x first
#define y second
using namespace std;
ifstream fin("secv5.in");
ofstream fout("secv5.out");
long long n,a[(1<<20)+5],r[(1<<20)+5],p,f,val,poz,st,dr,mij,r1,r2,rez,l,u;
vector<pair<long long,int > >v[M];
void update()
{
for(;poz<=n;poz+=(poz&(-poz)))
r[poz]+=val;
}
long long query(int poz)
{
long long s=0;
for(;poz;poz-=(poz&(-poz)))
s+=r[poz];
return s;
}
int main()
{
fin>>n>>l>>u;
for(int i=1;i<=n;i++)
fin>>a[i];
for(int i=1;i<=n;i++)
{
f=a[i]%M;
p=0;
for(auto j:v[f])
if(j.x==a[i])
{
p=1;
break;
}
v[f].pb({a[i],i});
if(p==0)
{
val=1;
poz=i;
update();
}
}
for(int i=1;i<=n;i++)
{
st=i;
dr=n;
f=a[i]%M;
while(st<dr)
{
mij=(st+dr)/2;
if(query(mij)>=l)
dr=mij;
else
st=mij+1;
}
if(query(st)>=l)
{
r1=st;
st=i;
dr=n;
while(st<dr)
{
mij=(st+dr+1)/2;
if(query(mij)<=u)
st=mij;
else
dr=mij-1;
}
r2=st;
rez+=(r2-r1+1);
}
for(int j=0;j<v[f].size();j++)
if(v[f][j].y==i)
{
v[f].erase(v[f].begin()+j);
break;
}
poz=i;
val=-1;
update();
for(auto j:v[f])
if(j.x==a[i])
{
poz=j.y;
val=1;
update();
break;
}
}
fout<<rez;
}