Cod sursa(job #1303167)

Utilizator costyv87Vlad Costin costyv87 Data 27 decembrie 2014 18:05:23
Problema Secventa 5 Scor 100
Compilator cpp Status done
Runda Teme Pregatire ACM Unibuc 2014, Anul I Marime 1.65 kb
#include <cstdio>
#include <algorithm>
#include <list>
#define md 666013
#define mp make_pair
#define X first
#define C second
#define ll (long long)
using namespace std;

FILE *f,*g;
int st,dr,ST,DR;
int n,l,u,i;
long long R,r;
unsigned int v[1<<21];

list <pair<unsigned int,int> > H[2][md];
int cn[2];

unsigned int inline heap_key(unsigned int val)
{
    return ( (unsigned int)val%md);
}


void insert_heap(int ind,unsigned int val)
{
    int key = heap_key(val);
    list<pair<unsigned int,int> >::iterator it;

    for (it = H[ind][key].begin(); it!=H[ind][key].end();it++)
        if ( (*it).X == val)
        {
            (*it).C++;
            return ;
        }
    H[ind][key].push_back(mp(val,1));
    cn[ind]++;
}

void erase_heap(int ind,unsigned int val)
{
    int key = heap_key(val);
    list<pair<unsigned int,int> >::iterator it;

    for (it = H[ind][key].begin();it!=H[ind][key].end();it++)
        if ( (*it).X == val)
        {
            (*it).C--;
            if ((*it).C == 0)
            {
                H[ind][key].erase(it);
                cn[ind]--;
            }
            return ;
        }
}

int main()
{
    f=fopen("secv5.in","r");
    g=fopen("secv5.out","w");


    fscanf(f,"%d%d%d",&n,&l,&u);
    l--;

    for (i=1,st=ST=1;i<=n;i++)
    {
        fscanf(f,"%ud",&v[i]);

        insert_heap(0,v[i]);
        insert_heap(1,v[i]);

        while (cn[0]>l) erase_heap(0,v[st++]);
        while (cn[1]>u) erase_heap(1,v[ST++]);

        r = ll r + (ll i-st+1);
        R = ll R + (ll i-ST+1);
    }

    R =ll R-r;

    fprintf(g,"%lld",R);

    return 0;
}