Помогите понять что делает эта программа и на каком принципе она основана: {$I-,S-,Q-,R-} Program m_inverse; var i: LongInt; N: LongInt; Result: Int64; P, Pos, S: Array[1..100000] of LongInt; RCnt, LCnt: Array[1..100000] of Int64; Function Prev(X: LongInt): LongInt; begin Prev:= X and (X-1); end; Function Next(X: LongInt): LongInt; begin Next:= X shl 1 - Prev(X); end; Procedure Add(pos: LongInt); var X: LongInt; begin X:= pos; While X <= N do begin Inc(S[X]); X:= Next(X); end; end; Function FindSimpleSum(x: LongInt): LongInt; var Sum: LongInt; begin Sum:= 0; While x>0 do begin Sum:= Sum + S[x]; x:= Prev(x); end; FindSimpleSum:= Sum; end; Function FindSum(l, r: LongInt): LongInt; begin FindSum:= FindSimpleSum(r) - FindSimpleSum(l-1); end; begin Assign(Input, 'input.txt'); ReSet(Input); ReadLn(N); For i:= 1 to N do begin ReadLn(P[i]); Pos[P[i]]:= i; end; Close(Input); FillChar(S, SizeOf(S), 0); For i:= 1 to N do begin RCnt[Pos[i]]:= FindSum(Pos[i]+1, N); Add(Pos[i]); end; FillChar(S, SizeOf(S), 0); For i:= N downto 1 do begin LCnt[Pos[i]]:= FindSum(1, Pos[i]-1); Add(Pos[i]); end; Result:= 0; For i:= 1 to N do Result:= Result + LCnt[i] * RCnt[i]; Assign(Output, 'output.txt'); ReWrite(Output); WriteLn(Result); Close(Output); end.