Solleone sul lungomare

Ciao a tutti,
al di là della correttezza o meno della mia soluzione (per la quale certamente tornerò sul forum)… qualcuno sa dirmi perchè il primo output mi dà risultato sbagliato, mentre eseguendolo in locale è giusto?

#include <bits/stdc++.h>
using namespace std;

long long int percorri(int N, long long int L, long long int D[], long long int P[]) {
    long long int minimo=1, massimo, medio,ris=L;
    bool ok,cambio;
    int iprec,app;

    massimo=L;
    while(massimo>=minimo){
        //cout<<ris<<"  ";
        medio=(massimo+minimo)/2;
        //cout<<minimo<<"  "<<medio<<"  "<<massimo<<endl;

        iprec=-1;
        for(int i=0;D[i]<=medio;i++){
            if(D[i]+P[i]<=medio)
                iprec=i;
        }
        if(iprec==-1){
            minimo=medio+1;
            continue;
        }

        while(1){
            ok=false;
            cambio=false;
            app=0;

            for(int i=iprec+1; i<N;i++){
                if(P[iprec]+D[i]-D[iprec]>medio)
                    break;
                if(P[iprec]+D[i]-D[iprec]+P[i]<=medio){
                    app=i;
                    ok=true;
                }
            }

            if(D[iprec]+medio-P[iprec]>=L){
                cambio=true;
                if(medio <ris)
                    ris=medio;
            }

            if(cambio){
                massimo=medio-1;
                break;
            }

            iprec=app;
            if(!ok){
                minimo=medio+1;
                break;
            }

        }
    }
    //cout<<ris;
    return ris;
}