Cod sursa(job #791739)

Utilizator maritimCristian Lambru maritim Data 24 septembrie 2012 23:35:30
Problema Secventa 5 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.77 kb
#include<stdio.h>
#include<algorithm>
#include<vector>
using namespace std;

FILE *f = fopen("secv5.in","r");
FILE *g = fopen("secv5.out","w");

typedef vector<pair<unsigned int,int> >::iterator it;

#define MaxN ((2<<20)+100)
#define M 666013
#define ll long long
#define ui unsigned int

int N,L,U,l,u,poz_l=1,poz_u = 1;
ll Sol;
ui A[MaxN],B[MaxN];
int BestL[MaxN],BestU[MaxN];
vector<pair<ui,int> > H[M];

void citire(void)
{
    fscanf(f,"%d %d %d\n",&N,&U,&L);
    for(int i=1;i<=N;i++)
        fscanf(f,"%u ",&A[i]);

    -- U;
}

inline void AddHash(ui a,int poz_norm)
{
    int x = a%M;

    for(it i=H[x].begin();i<H[x].end();i++)
        if(i->first == a)
            return ;

    H[x].push_back(make_pair(a,poz_norm));
}

inline int ValHash(ui a)
{
    int x = a%M;

    for(it i=H[x].begin();i<H[x].end();i++)
        if(i->first == a)
            return i->second;

    return -1;
}

void Normalizare(void)
{
    int poz = 0;
    
    for(int i=1;i<=N;i++)
        B[i] = A[i];

    sort(B+1,B+N+1);

    for(int i=1;i<=N;i++)
        if(B[i] != B[i-1])
            AddHash(B[i],++poz);
}

inline void ExtragereL(int a)
{
    BestL[a]--; poz_l ++;

    if(!BestL[a])
        -- l;
}

inline void ExtragereU(int a)
{
    BestU[a] --; poz_u ++;

    if(!BestU[a])
        --u;
}

inline void AdaugareL(int a)
{
    l += (!BestL[a]);

    BestL[a]++;

    while(l>L)
        ExtragereL(ValHash(A[poz_l]));
}

inline void AdaugareU(int a)
{
    u += (!BestU[a]);

    BestU[a] ++;

    while(u>U)
        ExtragereU(ValHash(A[poz_u]));
}

void Rezolvare(void)
{
    Normalizare();

    for(int i=1;i<=N;i++)
    {
        AdaugareL(ValHash(A[i]));
        AdaugareU(ValHash(A[i]));
        Sol = Sol+poz_u-poz_l;
    }
}

int main()
{
    citire();
    Rezolvare();

    fprintf(g,"%lld\n",Sol);
}