Cod sursa(job #1579376)

Utilizator Master011Dragos Martac Master011 Data 24 ianuarie 2016 18:05:28
Problema Secventa 5 Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include<cstdio>
using namespace std;

const int nMax = (1 << 20) + 1, R = 666013;
unsigned int dq[2][nMax], dim[2][2], n, l, u, v[nMax], vf[2], sol, nrDif[2], pozp;
unsigned int nrAp[2][nMax], val[2][nMax], urm[2][nMax], lst[2][R];


unsigned int gaseste (unsigned int x, unsigned int ind){
    unsigned int tip = x % R, poz = lst[ind][tip];
    pozp = -1;
    while(poz){
        if(val[ind][poz] == x)
            return poz;

        pozp = poz;
        poz = urm[ind][poz];
    }
    return poz;
}

inline void adauga(unsigned int x, unsigned int ind, unsigned int i){
    dq[ind][++dim[ind][1]] = i;
    unsigned int tip = x % R, poz = gaseste(x, ind);
    if(poz){
        nrAp[ind][poz]++;
    }else{
        nrDif[ind]++;
        val[ind][++vf[ind]] = x;
        nrAp[ind][vf[ind]] = 1;
        urm[ind][vf[ind]] = lst[ind][tip];
        lst[ind][tip] = vf[ind];
    }
}

inline void scoate(unsigned int lim, unsigned int ind){
    unsigned int tip, x, poz;
    bool ok = true;
    while(nrDif[ind] >= lim && ok){

        x = v[dq[ind][dim[ind][0]++]];
        poz = gaseste(x, ind);
        nrAp[ind][poz]--;

        if(!nrAp[ind][poz] && lim == l && nrDif[ind] == lim){
            ok = false;
            dim[ind][0]--;
            nrAp[ind][poz]++;
        }

        if(!nrAp[ind][poz] && ok){

            nrDif[ind]--;
            tip = x % R;
            if(poz == lst[ind][tip]){
                lst[ind][tip] = urm[ind][poz];
            }else{
                urm[ind][pozp] = urm[ind][poz];
            }
        }
    }
}

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

    fscanf(in,"%u%u%u", &n, &l, &u);

    dim[0][0] = dim[1][0] = 1;
    unsigned int l1, l2;
    for(unsigned int i = 1 ; i <= n ; ++i){
        fscanf(in,"%u", v + i);
        adauga(v[i], 0, i);
        adauga(v[i], 1, i);

        scoate(l, 0);
        scoate(u + 1, 1);

        if(nrDif[0] == l){
            l1 = dq[0][dim[0][1]] - dq[0][dim[0][0]];
            l2 = dq[1][dim[1][1]] - dq[1][dim[1][0]];
            sol += 1 + (l2 - l1);
        }
    }

    fprintf(out,"%u\n", sol);
    return 0;
}