Cod sursa(job #2350804)

Utilizator mjmilan11Mujdar Milan mjmilan11 Data 21 februarie 2019 18:44:50
Problema Secventa 5 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.58 kb
#include <bits/stdc++.h>

using namespace std;

ifstream fin("secv5.in");
ofstream fout("secv5.out");

const int NMAX = (1<<20)+5;
const int INF = (1<<29);

unsigned int a[NMAX],norm_a[NMAX];
unsigned int v[NMAX],frecv[NMAX];

int main()
{
    int n,l,u;
    fin >> n >> l >> u;
    for(int i=1;i<=n;i++)
    {
        fin >> a[i];
        norm_a[i]=a[i];
    }
    sort(norm_a+1,norm_a+n+1);
    int k=0;
    norm_a[0]=-INF;
    for(int i=1;i<=n;i++)
    {
        if(norm_a[i]!=norm_a[i-1])
        {
            v[++k]=norm_a[i];
        }
    }
    for(int i=1;i<=n;i++)
    {
        int st=1;
        int dr=k,mij,rrasp=0;
        while(st<=dr)
        {
            mij=(st+dr)/2;
            if(a[i]>=v[mij])
            {
                st=mij+1;
                rrasp=mij;
            }
            else dr=mij-1;
        }
        norm_a[i]=rrasp;
    }
    int dif=0;
    int st=1;
    long long rasp=0;
    for(int i=1;i<=n;i++)
    {
        if(frecv[norm_a[i]]==0) dif++;
        frecv[norm_a[i]]++;
        while(dif>u)
        {
            frecv[norm_a[st]]--;
            if(frecv[norm_a[st]]==0) dif--;
            st++;
        }
        rasp+=(i-st+1);
    }
    for(int i=1;i<=n;i++) frecv[i]=0;
    dif=0;
    st=1;
    for(int i=1;i<=n;i++)
    {
        if(frecv[norm_a[i]]==0) dif++;
        frecv[norm_a[i]]++;
        while(dif>=l)
        {
            frecv[norm_a[st]]--;
            if(frecv[norm_a[st]]==0) dif--;
            st++;
        }
        rasp-=(i-st+1);
    }
    fout << rasp;
    return 0;
}