Cod sursa(job #1766519)

Utilizator demetriad-dagpagDavid Demetriad demetriad-dagpag Data 27 septembrie 2016 23:54:37
Problema Secventa 5 Scor 50
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.95 kb
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define MOD 2000000
using namespace std;
int v[2000000],f[2000000],lista[2000000],urm[2000000],vv[2000000],nad;
struct gogu
{
    unsigned val;int p;
}vc[2000000];
bool comp(gogu a,gogu b)
{
    return a.val<b.val;
}
int adauga(int x)
{
    int p;
    if(lista[x%MOD]==0)
    {
        nad++;
        urm[nad]=0;
        lista[x%MOD]=nad;
        f[nad]=1;
        v[nad]=x;
        return 1;
    }
    else
    {
        p=lista[x%MOD];
        if(v[p]>=x)
        {
            if(v[p]==x){ f[p]++; return 0; }
            else
            {
                nad++;
                v[nad]=x;
                lista[x%MOD]=nad;
                urm[nad]=p;
            }
                f[nad]=1;
                return 1;
        }
        else
        {
            while(urm[p]!=0 && v[urm[p]]<x) p=urm[p];
            if(v[urm[p]]==x){ f[urm[p]]++; return 0; }
            else
            {
                nad++;
                urm[nad]=urm[p];
                urm[p]=nad;
                f[nad]=1;
                v[nad]=x;
                return 1;
            }
        }
    }
}
int sterge(int x)
{
    int p=lista[x%MOD];
    if(v[p]>=x){
        if(v[p]==x && f[p]>1){
            f[p]--;
            return 0;
        }
        else
        {
            if(v[p]==x){
                f[p]=0;
                lista[x%MOD]=urm[p];
                return 1;
            }
        }
    }
    else{
        while(urm[p]!=0 && v[urm[p]]<x) p=urm[p];
        if(v[urm[p]]==x)
        {
            if(f[p]>1)
            {
                f[p]--;
                return 0;
            }
            else
            {
                f[p]=0;
                urm[p]=urm[urm[p]];
                return 1;
            }
        }
        return 0;
    }
}
int sol(int x,int n)
{
    int nr=0,i,sum=0,j;
    nad=0;
    if(x!=0){
        for(i=1; nr<=x && i<=n; i++)
            nr+=adauga(vv[i]);
        if(nr>x)
            nr-=sterge(vv[--i]);
        i--;
        sum+=i;
        for(j=2; j<=n; j++)
        {
            nr-=sterge(vv[j-1]);
            while(i<=n && nr<=x)
                nr+=adauga(vv[++i]);
            nr-=sterge(vv[i--]);
            sum+=(i-j+1);
        }
        for(i=1; i<=n; i++)
            lista[i]=urm[i]=f[i]=v[i]=0;
        return sum;
    }
    return 0;
}
int main()
{
    int n,l,u,i,nr,j,z;
    freopen("secv5.in","r",stdin);
    freopen("secv5.out","w",stdout);
    scanf("%d%d%d",&n,&l,&u);
    for(i=1; i<=n; i++){
        scanf("%u",&vc[i].val);
        vc[i].p=i;
    }
    sort(vc+1,vc+n+1,comp);
    nr=0;
    for(i=1; i<=n;)
    {
        j=i;
        nr++;
        z=vc[i].val;
        while(j<=n && z==vc[j].val) vc[j].val=nr,j++;
        i=j;
    }
    for(i=1; i<=n; i++)
        vv[vc[i].p]=vc[i].val;
    printf("%d\n",sol(u,n)-sol(l-1,n));

    return 0;
}