Cod sursa(job #2683215)

Utilizator loraclorac lorac lorac Data 10 decembrie 2020 17:51:41
Problema Secventa 5 Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <bits/stdc++.h>
using namespace std;
ifstream in("secv5.in");
ofstream out("secv5.out");
typedef long long ll;
const ll lim=(1LL<<20)+5;
const ll inf=2e9+7;
ll tree[4*lim];
ll flw[lim];
ll ind[lim];
ll v[lim];
void update(ll nod,ll l,ll r,ll poz,ll val)
{
    if(l==r)
    {
        tree[nod]=val;
        return ;
    }
    ll med=(l+r)/2;
    if(poz<=med) update(2*nod,l,med,poz,val);
    else update(2*nod+1,med+1,r,poz,val);
    tree[nod]=tree[2*nod]+tree[2*nod+1];
}
ll findk(ll nod,ll l,ll r,ll k)
{
    if(l==r) return l;
    ll med=(l+r)/2;
    if(tree[2*nod]>=k)
        return findk(2*nod,l,med,k);
    return findk(2*nod+1,med+1,r,k-tree[2*nod]);
}
bool mycmp(ll a,ll b)
{
    if(v[a]==v[b])
        return a<b;
    return v[a]<v[b];
}
int main()
{
    ll n,l,u;
    in>>n>>l>>u;
    for(ll i=1;i<=n;++i)
    {
        in>>v[i];
        ind[i]=i;
    }
    v[n+1]=inf;
    ind[n+1]=n+1;
    sort(ind+1,ind+n+2,mycmp);
    ll cnt=1;
    update(1,1,n+1,ind[1],1);
    for(ll i=2;i<=n+1;++i)
    {
        if(v[ind[i]]==v[ind[i-1]])
        {
            flw[ind[i-1]]=ind[i];
            v[ind[i-1]]=cnt;
        }
        else
        {
            update(1,1,n+1,ind[i],1);
            v[ind[i-1]]=cnt;
            ++cnt;
        }
    }
    ll ans=0;
    v[ind[n+1]]=cnt;
    for(ll i=1;i<=n;++i)
    {
        ll st=findk(1,1,n+1,l);
        ll dr=findk(1,1,n+1,u+1);
        ans+=(dr-st);
        update(1,1,n+1,i,0);
        if(flw[i]!=0)
            update(1,1,n+1,flw[i],1);
    }
    out<<ans<<'\n';
    return 0;
}