Cod sursa(job #990448)

Utilizator DaNutZ2UuUUBB Bora Dan DaNutZ2UuU Data 28 august 2013 12:49:43
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.51 kb
#include<stdio.h>
#include<algorithm>
#include<vector>
#include<fstream>
#include<ctype.h>
using namespace std;
 
ifstream f("secv5.in");
ofstream g("secv5.out");
 
#define MaxN ((1<<20)+100)
#define ll unsigned long long
#define ui unsigned int
 
int N,L,U,l,u,poz_l = 1,poz_u = 1;
ll Sol;
ui A[MaxN];
vector<pair<ui,int> > B;
int BestL[MaxN],BestU[MaxN];
char S[12*MaxN];
 
void citire(void)
{
    int a = 0;
 
    f >> N >> U >> L;
    for(int i=1;i<=N;i++)
        f >> A[i];
    -- U;
}
 
void Normalizare(void)
{
    int poz = 1;
     
    for(int i=1;i<=N;i++)
        B.push_back(make_pair(A[i],i));
 
    sort(B.begin(),B.end());
 
    A[B[0].second] = 1;
 
    for(int i=1;i<N;i++)
    {
        if(B[i].first != B[i-1].first)
            ++ poz;
         
        A[B[i].second] = poz;
    }
}
 
inline void AdaugareL(int a)
{
    l += (!BestL[a]);
 
    BestL[a]++;
 
    while(l>L)
    { 
        a = A[poz_l];
 
        BestL[a]--; poz_l ++;
 
        if(!BestL[a])
            -- l;
    }
}
 
inline void AdaugareU(int a)
{
    u += (!BestU[a]);
 
    BestU[a] ++;
 
    while(u>U)
    {
        a = A[poz_u];
 
        BestU[a] --; poz_u ++;
 
        if(!BestU[a])
            --u;
    }
}
 
void Rezolvare(void)
{
    Normalizare();
 
    for(int i=1;i<=N;i++)
    {
        AdaugareL(A[i]);
        AdaugareU(A[i]);
        Sol += (ll)poz_u-poz_l;
    }
}
 
int main()
{
    citire();
    Rezolvare();
 
    g << Sol << "\n";
}