#include <iostream>
#include <algorithm>

typedef unsigned int uint32;

using namespace std;

/*GLOBAL*******neki niz od 0 - 100*/
uint32 data[] = { 27 , 18 , 0 ,3 , 5 , 4 , 6 , 7 , 8 , 14 };
/**********************************/

class NumberManager  {
public:
   NumberManager() {} 
   ~NumberManager() {} 
   
   uint32* getMaxNum(uint32* begin , uint32 end);
   uint32 getMaxValue() const {return *maxValue;}
   void swapValues( uint32* first , uint32* second);
   
protected:
    void update();

private:
    /*daj flagove na bitne vrijednosti*/
    uint32* maxValue;
    
};

void NumberManager::swapValues( uint32* first , uint32* second)
{
    ptrdiff_t shift;
    if(second == maxValue)
    {
        shift = first - second;
    }

    if(first == maxValue )
    {
        shift = second - first;
    }
    
    swap( *first , *second ); 
    maxValue += shift;
}

void NumberManager::update()
{
    /* operacija 1
    /* operacija 2
    /* operacija ...*/
}

bool maxTwoUint32(uint32 i, uint32 j) 
{ 
   /* static int counter;
    cout<< "loop : " << counter++ << endl; */
    return i<j; 
}

uint32* NumberManager::getMaxNum(uint32* begin , uint32 end)
{
    maxValue = max_element(begin , begin+end , maxTwoUint32);
    return maxValue;
}


bool oddValue (uint32 val)
{ 
    return ((val%2)==1); 
}


int main() 
{
    
    NumberManager numManager;
    
    /* frame 1 INITIALIZATION****************************************************/
    uint32* result = numManager.getMaxNum(data , 10);
    cout<< "FRAME 1\nOvdje po onome kako si predstavio problem imaš \n" 
        << "unsorted array pa time i O(n) limitacije kod trazenja\n"
        << "najveceg broja" << endl; 
    cout<< "najveci broj : " << *result << "\n\n" << endl;
    /***************************************************************/
    
    
    /*frame 2 CHANGE******************************************************/
    for(uint32 i=0 ; i<10 ; i++)
    {
        data[i] += 83;
    }
    /*ova operacija koja slijedi je nepotrebna dalje jer 
    ako je na indexu 9 (u ovom slučaju broj 19) bio najveći broj
    , bit će i dalje nakon operacija mnozenja i zbrajanja tako
    da u ovom frameu nije potreban checking*/
    result = numManager.getMaxNum(data , 10);
    cout<< "FRAME 2\nnajveci broj nakon sto je na svaki broj u data \n" <<
           "dodan 83 je : " << *result << endl;
    
    for(uint32 i=0 ; i<10 ; i++)
    {
        cout<< data[i] << endl;
    }
        
    /***************************************************************/
    /* znaci prilagoditi main algoritme da uopce ne provjeravaju   */                                                      
    /* ishode koji su unaprijed logikom znani                      */                                         
    /***************************************************************/
    
    
    
    /*frame 3 CHANGE_AGAIN******************************************************/
    numManager.swapValues( data , data+2 );
    cout<< "\n\nFRAME 3\n";
    for(uint32 i=0 ; i<10 ; i++)
    {
        cout<< data[i] << endl;
    }
    cout<< "swap nultog i 2 index-a" << endl;
    cout<< "najveci broj : " << numManager.getMaxValue() 
        << " s direktnim pristupom" << endl;    
    /*******************************************************************/
    /* imas odmah dohvat na max_element koji gore pratis u samoj klasi */
    /* bez rolanja kroz sve elemente                                   */
    /*******************************************************************/
    
    /**********************/
    /* itd...             */
    /**********************/
   

    return 0;
}