Cod sursa(job #2149762)

Utilizator patcasrarespatcas rares danut patcasrares Data 2 martie 2018 22:49:14
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.94 kb
#include<fstream>
#include<vector>
#define M 6666013
#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;
}