Cod sursa(job #2149783)

Utilizator patcasrarespatcas rares danut patcasrares Data 2 martie 2018 23:05:44
Problema Secventa 5 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#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;
}