code 36021;
 procedure SNDREMEZ(N,M,S,G,EM);
 value N,M;integer N,M;
 integer array S; array G,EM;
 comment SNDREMEZ EXCHANGES ATMOST N+1 NUMBERS ,GIVEN IN
           INTEGER ARRAY S[0:N], WITH NUMBERS OUT OF THE
           REFERENCE SET 0,...M, UNDER THE CONDITIONS:
      I.   THE ALTERNANCE PROPERTY OF THE FUNCTIONVALUES G[S[J]],
           J=0,...N IS PRESERVED.
      II.  !G[S[J]]!>=!EM[0]!,J=0,...N.
      III. THE FIRST INDEX K , WITH G[K]=INFINITY NORM OF G,
           IS ONE OF THE RESULTING NUMBERS S[0],...S[N].
           IN ARRAY G[0:M] ONE MUST GIVE ERROR FUNCTION VALUES.
           MOREOVER,
           EM[1]:=INFINITY NORM OF G,
      THE PROCEDURE INFNRMVEC IS USED;
 begin integer S0,SN,SJP1,I,J,K,UP,INDEXMAX,LOW,NM1;
    real MAX,MSJP1,HI,HJ,HE,ABSE,H;
     INDEX MAX:=S0:=SJP1:=S[0];
     HE:=EM[0];LOW:=S0+1;
     MAX:=MSJP1:=ABSE:=ABS(HE);
     NM1:=N-1;
     for J:= 0 step 1 until NM1 do 
     begin 
        UP:= S[J+1]-1;
        H:= INFNRMVEC(LOW,UP,I,G);
        if H > MAX  then begin MAX:= H; INDEX MAX:= I end;
        if H > ABSE then 
        begin if HE * G[I] > 0 then 
           begin S[J]:= if MSJP1 < H then I else SJP1;
              SJP1:= S[J+1]; MSJP1:= ABSE
           end else 
           begin S[J]:= SJP1; SJP1:= I; MSJP1:= H end 
        end else 
        begin S[J]:=SJP1; SJP1:=S[J+1]; MSJP1:= ABSE end;
        HE:=-HE;LOW:=UP+2;
    end FOR J; SN:= S[N]; S[N]:= SJP1;

    HI:=INFNRMVEC(0,S0-1,I,G);
    HJ:=INFNRMVEC(SN+1,M,J,G);
    if J  > M  then J:=M;
    if HI > HJ then 
    begin if HI > MAX then begin MAX:= HI; INDEXMAX:= I end;
       if SIGN(G[I]) =  SIGN(G[S[0]]) then 
       begin if HI > ABS(G[S[0]])   then 
          begin S[0]:= I;
             if G[J]/G[S[N]] > 1 then S[N]:=J
          end 
       end else 
       if HI > ABS(G[S[N]]) then 
       begin S[N]:= if G[J]/G[S[NM1]] > 1  then J else S[NM1];
          for K:= NM1 step -1 until 1 do S[K]:= S[K-1];
          S[0]:= I
       end 
    end else 
    begin if HJ > MAX then begin MAX:= HJ; INDEXMAX:= J end;
       if SIGN(G[J]) = SIGN(G[S[N]]) then 
       begin if HJ > ABS(G[S[N]])  then 
          begin S[N]:= J; if G[I]/G[S[0]] > 1 then S[0]:=I end 
       end else 
       if HJ > ABS(G[S[0]]) then 
       begin S[0]:= if G[I]/G[S[1]] > 1 then I else S[1];
          for K:= 1 step 1 until NM 1 do S[K]:= S[K+1];
          S[N]:= J
       end 
    end RANDGEBIEDEN;
    EM[1]:=MAX;
 end SNDREMEZ;
        eop