#include <iostream> #include "teatr.h" #include "message.h" using namespace std; long long one = 1; const int L = 1048576; int D[2*L]; void update( int x ) { x += L; while ( x >= 1 ) { D[x]++; x >>= 1; } } int sum( int a, int b = L, int left = 0, int right = L, int x = 1 ) { if ( left >= b || right <= a ) return 0; else if ( left >= a && right <= b ) return D[x]; else { int mid = ( left + right ) / 2; int l = sum( a, b, left, mid, 2*x ); int r = sum( a, b, mid, right, 2*x+1 ); return l+r; } } int main() { int n = GetN(), id = MyNodeId(), x; if ( id ) return 0; long long answer = 0; for ( int i = 0; i < n; ++i ) { x = GetElement( i ); answer += sum( x+1 ); update( x ); } cout << answer << endl; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #include <iostream> #include "teatr.h" #include "message.h" using namespace std; long long one = 1; const int L = 1048576; int D[2*L]; void update( int x ) { x += L; while ( x >= 1 ) { D[x]++; x >>= 1; } } int sum( int a, int b = L, int left = 0, int right = L, int x = 1 ) { if ( left >= b || right <= a ) return 0; else if ( left >= a && right <= b ) return D[x]; else { int mid = ( left + right ) / 2; int l = sum( a, b, left, mid, 2*x ); int r = sum( a, b, mid, right, 2*x+1 ); return l+r; } } int main() { int n = GetN(), id = MyNodeId(), x; if ( id ) return 0; long long answer = 0; for ( int i = 0; i < n; ++i ) { x = GetElement( i ); answer += sum( x+1 ); update( x ); } cout << answer << endl; } |