/*
    Niz integera i njegovi razni podnizovi.

    Podniz moze imati najmanje dva broja.


    eliminisi_duple_brojeve_u_podnizovima(niz,&n);

    ostavi_samo_podnizove_sa_duplim_brojevima(niz,&n);

    podnizovi_istih_parnih_brojeva(niz,&n);

    podnizovi_istih_neparnih_brojeva(niz,&n);

    podnizovi_parnih_brojeva(niz,&n);

    podnizovi_neparnih_brojeva(niz,&n);

    najduzi_podniz_istih(niz,n);

*/

#include <stdio.h>


void PrikaziNiz( int niz[], int brClanova )
{
    int i;

    printf("\n");

    for(i=0;i<brClanova;i++)
        printf("%3d", niz[i] );

    printf("\n");
}


void StampajIndekseNiza( int niz[], int brClanova )
{
    int i;

    printf("\n\n");

    for(i=0;i<brClanova;i++)
        printf("%3d", i );

    printf("\n");
}


// Nalazi i prikazuje najduzi podniz istih brojeva.
void najduzi_podniz_istih(int niz[],int n)
{
    int i=0;        // M znaci memorisane vrednosti i to je krajnji rezultat
    int Mmax_indeks, Mmax_karakter, Mmax_duzina=0;
    int T_indeks, T_karakter, T_duzina; // T znaci trenutne vrednosti

    while(i<n){     // za sve clanove niza

        // Preskaci dok ne naidjes na podniz (bar dva ista broja)
        while( niz[i] != niz[i+1]  &&  i < n )  // dok je tekuci razlicit od sledeceg
            i++;                                // prelazimo na sledeci clan niza

        // Sada smo na prvom clanu tekuceg podniza i pamtimo njegove karakteristike
        T_indeks=i;          // indeks pocetka tekuceg podniza
        T_karakter=niz[i];   // karakter (broj) koji cini tekuceg podniz
        T_duzina=0;          // anuliramo brojac clanova tekuceg podniza
        // brojimo duzinu trenutnog podniza
        while( niz[i] == niz[i+1]  &&  i < n ){ // dok je tekuci jednak sledecem
            T_duzina++;                 // uvecavamo brojac clanova tekuceg podniza
            i++;                        // prelazimo na sledeci clan niza
        }

        // Odredjivanje naduzeg podniza.
        // Ako je najduzi manji od tekuceg onda tekuci postaje najduzi.
        if(Mmax_duzina < T_duzina) {    // Ako je maksimalni manji od tekuceg,
            Mmax_indeks = T_indeks;     // tekuci podniz postaje maksimalni podniz.
            Mmax_karakter = T_karakter;
            Mmax_duzina = T_duzina;
        }
    }

    Mmax_duzina++;                      // duzinu najduzeg uvacavamo za 1

    // Prikazujemo izvestaj
    printf("\n\n Najduzi podniz istih brojeva pocinje od indeksa %d, i ima %d karaktera %d \n\n",
           Mmax_indeks, Mmax_duzina, Mmax_karakter);

    // Prikazujemo najduzi podniz datog niza
    printf("\n Najduzi podniz istih brojeva je: ");
    for( i=Mmax_indeks; i<=Mmax_indeks+Mmax_duzina-1; i++ )
        printf(" %d",niz[i]);
}


// Eliminise duple brojeve u podnizovima, menja broj clanova novog niza
void eliminisi_duple_brojeve_u_podnizovima(int niz[],int *n)
{
    int i=0, n1=0;      // n1 je indeks novog niza

    while ( i < *n ){   // od pocetka do kraja niza

        if( niz[i+1] != niz[i] )    // ako sledeci nije jednak trenutnom
            niz[n1++] = niz[i++];   // stavi ga u niz

        while ( niz[i+1] == niz[i] )    // dok je sledeci jednak trenutnom
            i++;                        // predji na sledeci
    }

    *n = n1;    // novi broj clanova niza

    printf("\n eliminisi_duple_brojeve_u_podnizovima \n");
    PrikaziNiz(niz,*n);
}


// Ostavlja samo podnizove sa duplim brojevima, menja broj clanova novog niza
void ostavi_samo_podnizove_sa_duplim_brojevima(int niz[],int *n)
{
    int i=0, n1=0;      // n1 je indeks novog niza

    while ( i < *n ){   // od pocetka do kraja niza

        while ( niz[i] == niz[i+1] )    // dok je tekuci jednak sledecem
            niz[n1++] = niz[i++];       // tekuci stavi u niz

        // Bez ovog if-a podnizovi bi bili skraceni za jedan element
        // probaj da iskljucis taj if i videces problem:

        if( niz[i] == niz[i-1] )        // ako je tekuci jednak prethodnom
            niz[n1++] = niz[i++];       // i njega (tekuci) stavi u niz

        while ( niz[i] != niz[i+1] )    // dok tekuci nije jednak sledecem
            i++;                        // predji na sledeci
    }

    *n = n1;    // novi broj clanova niza

    printf("\n ostavi_samo_podnizove_sa_duplim_brojevima \n");
    PrikaziNiz(niz,*n);
}


// Ostavlja samo podnizove sa istim parnim brojevima, menja broj clanova novog niza
void podnizovi_istih_parnih_brojeva(int niz[],int *n)
{
    int i=0,n1=0;   // n1 je broj clanova novog niza

    while(i<*n){    // od pocetka do kraja niza

        // preskoci neparne brojeve
        while(niz[i]%2 != 0)        // dok je tekuci neparan
            i++;                    // predji na sledeci clan niza

        // tekuci je sada paran i zato je dovoljno da pitao da li je jednak sledecem
        while(niz[i] == niz[i+1])   // dok je tekuci jednak sledecem
            niz[n1++]=niz[i++];     // stavi tekuci u niz

        // dodaj poslednji parni iz podniza parnih
        if( niz[i] == niz[i-1] )    // ako je tekuci jednak prethodnom
            niz[n1++] = niz[i++];   // i njega (tekuci) stavi u niz

        i++;                        // predji na sledeci clan niza
    }

    *n=n1;                          // broj elemenata novog niza

    printf("\n podnizovi_istih_parnih_brojeva \n");
    PrikaziNiz(niz,*n);
}


// Ostavlja samo podnizove sa istim neparnim brojevima, menja broj clanova novog niza
void podnizovi_istih_neparnih_brojeva(int niz[],int *n)
{
    int i=0, n1=0;      // n1 je indeks novog niza

    while ( i < *n ){   // od pocetka do kraja niza

        if( niz[i]%2 == 0 ) {   // ako je paran
            i++;                // predji na sledeceg
            continue;           // odmah idi na glavnu while( i < *n ) petlju
        }

        // tekuci je sada neparan
        // dok je tekuci jednak sledecem
        while ( niz[i] == niz[i+1] )
            niz[n1++] = niz[i++];       // tekuci stavi u niz

        // Bez ovog if-a podnizovi bi bili skraceni za jedan element
        // probaj da iskljucis taj if i videces problem:

        if( niz[i] == niz[i-1] )        // ako je tekuci jednak prethodnom
            niz[n1++] = niz[i++];       // i njega (tekuci) stavi u niz

        i++;    // predji na sledeceg
    }

    *n = n1;    // novi broj clanova niza

    printf("\n podnizovi_istih_neparnih_brojeva \n");
    PrikaziNiz(niz,*n);
}


// Ostavlja samo podnizove sa parnim brojevima, menja broj clanova novog niza
void podnizovi_parnih_brojeva(int niz[],int *n)
{
    int i=0, n1=0;      // n1 je indeks novog niza

    while ( i < *n ){   // od pocetka do kraja niza

        // Dok tekuci nije paran
        while ( niz[i]%2 != 0 )
            i++;                    // predji na sledeceg

        // Dok su i tekuci i sledeci parni
        while ( niz[i]%2 == 0   &&  niz[i+1]%2 == 0 )
            niz[n1++] = niz[i++];       // tekuci stavi u niz

        // Bez ovog if-a podnizovi bi bili skraceni za jedan element
        // probaj da iskljucis taj if i videces problem:

        if( niz[i-1]%2 == 0 ) // ako je prethodni od trenutnog paran
            niz[n1++] = niz[i++];       // i njega (tekuci) stavi u niz

        i++;    // predji na sledeceg
    }

    *n = n1;    // novi broj clanova niza

    printf("\n podnizovi_parnih_brojeva \n");
    PrikaziNiz(niz,*n);
}


// Ostavlja samo podnizove sa neparnim brojevima, menja broj clanova novog niza
void podnizovi_neparnih_brojeva(int niz[],int *n)
{
    int i=0, n1=0;      // n1 je indeks novog niza

    while ( i < *n ){   // od pocetka do kraja niza

        // Dok je tekuci paran
        while ( niz[i]%2 == 0  &&  i < *n )
            i++;                        // predji na sledeceg

        // Dok su i tekuci i sledeci neparni

        while ( niz[i]%2 != 0   &&  niz[i+1]%2 != 0 )
            niz[n1++] = niz[i++];       // tekuci stavi u niz

        // Bez ovog if-a podnizovi bi bili skraceni za jedan element
        // probaj da iskljucis taj if i videces problem:

        if( niz[i-1]%2 != 0 ) // ako je prethodni od tekuceg neparan
            niz[n1++] = niz[i++];       // i njega (tekuceg) stavi u niz

        i++;    // predji na sledeceg
    }

    *n = n1;    // novi broj clanova niza

    printf("\n podnizovi_neparnih_brojeva \n");
    PrikaziNiz(niz,*n);
}




int main(void)
{
//  int niz[] = {1,1,1,2,3,3,4,5,5,5,5,6,7,8,8,8,8,9,9};
    int niz[] = {1,2,3,3,4,4,4,5,5,5,6,6,7,8,8,8,8,9};
//  int niz[] = {1,2,3,2,2,4,-2,4,4,4,4,5,2,2,2,6,2,7};
//  int niz[] = {1,2,3,2,2,4,-2,4,4,4,4,5,2,2,2,6,2,7,4,4,4,4,4,4};
//  int niz[] = {4,4,4,4,4,4,4,1,2,3,2,2,4,-2,4,4,4,4,5,2,2,2,6,2,7};

    int n=sizeof(niz)/sizeof(int);

    printf("\n Duzina niza n = %d \n",n);

    StampajIndekseNiza(niz,n);

    PrikaziNiz(niz,n);

//    eliminisi_duple_brojeve_u_podnizovima(niz,&n);

//    ostavi_samo_podnizove_sa_duplim_brojevima(niz,&n);

//    podnizovi_istih_parnih_brojeva(niz,&n);

//    podnizovi_istih_neparnih_brojeva(niz,&n);

//    podnizovi_parnih_brojeva(niz,&n);

//    podnizovi_neparnih_brojeva(niz,&n);

    najduzi_podniz_istih(niz,n);


    printf("\n\n");
    return 0;
}