#include <fstream>
#include <iostream>
#include <deque>
#include <ctime>
using namespace std;
void ReadArray( deque<int> & arr )
{
ifstream arrfile("IntegerArray.txt");
int a;
while( arrfile >> a )
{
arr.push_back( a );
}
}
unsigned long MergeSortInversions(
const deque<int> & in,
int from, int to,
deque<int> & out
)
{
int diff = to - from;
if( diff == 0 )
{
out.push_back( in[from] );
return 0;
}
int div = (from + to) / 2;
deque<int> aleft;
unsigned long inv_left = MergeSortInversions( in, from, div, aleft );
deque<int> aright;
unsigned long inv_right = MergeSortInversions( in, div+1, to, aright );
unsigned long invs = 0;
while( aleft.size() != 0 && aright.size() != 0 )
{
int lval = *aleft.begin();
int rval = *aright.begin();
if( lval < rval )
{
out.push_back( lval );
aleft.pop_front();
}
else
{
out.push_back( rval );
aright.pop_front();
invs += aleft.size();
}
}
out.insert( out.end(), aright.begin(), aright.end() );
out.insert( out.end(), aleft.begin(), aleft.end() );
return inv_left + inv_right + invs;
}
unsigned long MergeSortInversions( const deque<int> & arr )
{
deque<int> sorted;
unsigned long int invs = MergeSortInversions( arr, 0, arr.size()-1, sorted);
return invs;
}
int main( /*int argc, char * argv[]*/ )
{
deque<int> arr;
ReadArray( arr );
unsigned long int good_result = 2407905288U;
cout << "Expected result: " << good_result << endl;
cout << "Array of " << arr.size() << " elements." << endl;
clock_t t = clock();
unsigned long int merge_inv = MergeSortInversions( arr );
t = clock() - t;
cout << "Merge inv: " << merge_inv << endl;
float ft = ((float)t)/CLOCKS_PER_SEC;
cout << "Completed in " << t << " : " << ft << endl;
return 0;
}
I2luY2x1ZGUgPGZzdHJlYW0+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGRlcXVlPgojaW5jbHVkZSA8Y3RpbWU+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdm9pZCBSZWFkQXJyYXkoIGRlcXVlPGludD4gJiBhcnIgKQp7CglpZnN0cmVhbSBhcnJmaWxlKCJJbnRlZ2VyQXJyYXkudHh0Iik7CglpbnQgYTsKCXdoaWxlKCBhcnJmaWxlID4+IGEgKQoJewoJCWFyci5wdXNoX2JhY2soIGEgKTsKCX0KfQp1bnNpZ25lZCBsb25nIE1lcmdlU29ydEludmVyc2lvbnMoCgljb25zdCBkZXF1ZTxpbnQ+ICYgaW4sCglpbnQgZnJvbSwgaW50IHRvLAoJZGVxdWU8aW50PiAmIG91dAoJKQp7CglpbnQgZGlmZiA9IHRvIC0gZnJvbTsKCWlmKCBkaWZmID09IDAgKQoJewoJCW91dC5wdXNoX2JhY2soIGluW2Zyb21dICk7CgkJcmV0dXJuIDA7Cgl9CgkKCWludCBkaXYgPSAoZnJvbSArIHRvKSAvIDI7CglkZXF1ZTxpbnQ+IGFsZWZ0OwoJdW5zaWduZWQgbG9uZyBpbnZfbGVmdCA9IE1lcmdlU29ydEludmVyc2lvbnMoIGluLCBmcm9tLCBkaXYsIGFsZWZ0ICk7CglkZXF1ZTxpbnQ+IGFyaWdodDsKCXVuc2lnbmVkIGxvbmcgaW52X3JpZ2h0ID0gTWVyZ2VTb3J0SW52ZXJzaW9ucyggaW4sIGRpdisxLCB0bywgYXJpZ2h0ICk7Cgl1bnNpZ25lZCBsb25nIGludnMgPSAwOwoJd2hpbGUoIGFsZWZ0LnNpemUoKSAhPSAwICYmIGFyaWdodC5zaXplKCkgIT0gMCApCgl7CgkJaW50IGx2YWwgPSAqYWxlZnQuYmVnaW4oKTsKCQlpbnQgcnZhbCA9ICphcmlnaHQuYmVnaW4oKTsKCQlpZiggbHZhbCA8IHJ2YWwgKQoJCXsKCQkJb3V0LnB1c2hfYmFjayggbHZhbCApOwoJCQlhbGVmdC5wb3BfZnJvbnQoKTsKCQl9CgkJZWxzZQoJCXsKCQkJb3V0LnB1c2hfYmFjayggcnZhbCApOwoJCQlhcmlnaHQucG9wX2Zyb250KCk7CgkJCWludnMgKz0gYWxlZnQuc2l6ZSgpOwoJCX0KCX0KCW91dC5pbnNlcnQoIG91dC5lbmQoKSwgYXJpZ2h0LmJlZ2luKCksIGFyaWdodC5lbmQoKSApOwoJb3V0Lmluc2VydCggb3V0LmVuZCgpLCBhbGVmdC5iZWdpbigpLCBhbGVmdC5lbmQoKSApOwoJcmV0dXJuIGludl9sZWZ0ICsgaW52X3JpZ2h0ICsgaW52czsKfQoKdW5zaWduZWQgbG9uZyBNZXJnZVNvcnRJbnZlcnNpb25zKCBjb25zdCBkZXF1ZTxpbnQ+ICYgYXJyICkKewoJZGVxdWU8aW50PiBzb3J0ZWQ7CQoJdW5zaWduZWQgbG9uZyBpbnQgaW52cyA9IE1lcmdlU29ydEludmVyc2lvbnMoIGFyciwgMCwgYXJyLnNpemUoKS0xLCBzb3J0ZWQpOwoJcmV0dXJuIGludnM7Cn0KCmludCBtYWluKCAvKmludCBhcmdjLCBjaGFyICogYXJndltdKi8gKQp7CglkZXF1ZTxpbnQ+IGFycjsKCVJlYWRBcnJheSggYXJyICk7Cgl1bnNpZ25lZCBsb25nIGludCBnb29kX3Jlc3VsdCA9IDI0MDc5MDUyODhVOwoJY291dCA8PCAgIkV4cGVjdGVkIHJlc3VsdDogIiA8PCBnb29kX3Jlc3VsdCA8PCBlbmRsOwoJY291dCA8PCAiQXJyYXkgb2YgIiA8PCBhcnIuc2l6ZSgpIDw8ICIgZWxlbWVudHMuIiA8PCBlbmRsOwoJY2xvY2tfdCB0ID0gY2xvY2soKTsKCXVuc2lnbmVkIGxvbmcgaW50IG1lcmdlX2ludiA9IE1lcmdlU29ydEludmVyc2lvbnMoIGFyciApOwoJdCA9IGNsb2NrKCkgLSB0OwoJY291dCA8PCAiTWVyZ2UgaW52OiAiIDw8IG1lcmdlX2ludiA8PCBlbmRsOwoJZmxvYXQgZnQgPSAoKGZsb2F0KXQpL0NMT0NLU19QRVJfU0VDOwoJY291dCA8PCAiQ29tcGxldGVkIGluICIgPDwgdCA8PCAiIDogIiA8PCBmdCA8PCBlbmRsOwoJcmV0dXJuIDA7Cn0K