Pagini recente » Cod sursa (job #2330892) | Cod sursa (job #2981692) | Cod sursa (job #2072281) | Cod sursa (job #977576) | Cod sursa (job #2149783)
#include<fstream>
#include<vector>
#define M 66013
#include<algorithm>
#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;
pair<long long,int >v[(1<<20)+5];
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];
v[i].x=a[i];
v[i].y=i;
}
sort(v+1,v+n+1);
for(int i=1;i<=n;i++)
if(i==1||v[i].x!=v[i-1].x)
{
poz=v[i].y;
val=1;
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);
}
poz=i;
val=-1;
update();
st=1;
dr=n;
while(st<dr)
{
mij=(st+dr)/2;
if(v[mij].x>a[i]||(v[mij].x==a[i]&&v[mij].y>i))
dr=mij;
else
st=mij+1;
}
if(v[st].x==a[i]&&v[st].y!=i)
{
poz=v[st].y;
val=1;
update();
}
}
fout<<rez;
}