Помогите понять что делает эта программа и на каком принципе она основана:
{$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.
Форум —
Development
