# [R], 47 bytes

<!-- language-all: lang-r -->

    function(v,a=v[v>0],b=sort(a))all(v[a]==b&a!=b)

[Try it online!][TIO-jlnvtfpk]

[R]: https://www.r-project.org/
[TIO-jlnvtfpk]: https://tio.run/##pZKxasMwFEX3fsUrhVaiNthxyaaOXTp06RYyyM5zLFCkIMkK@XpXjuymgTi4RCAQHs657z6brmZd3arKCa2ITzjzK/@erZOSWW0c4ZRyKYlf8TVj5TN/ZCXtalKRNE9gvMvzsxif9DWnAE/fpnXNEcheW9EroIC9FspZcBp@Py6Bqw14USF4NJbTh14ROFlgTJ8JRXZNkV9VZAnkMxQfXFr8o7DB0ePyaOpFrsGdRenRRvJbAosAj3Vkp0amw4/jLm5OfJlFaaiEqVrJDbhWKZQWwqr0ATcxQRqB6eSAl7zIgINwjW4doDphwnS4RUPo3C2EWEOaJHTC3YuFr89zoLRPVNA7SbHSYm5Vw2hbjRZKPOqwOSl2wg2ruv0H/IPW/QA "R – Try It Online"


----------


**Unrolled code and explanation :**

    f=
    function(v){          # v vector of tunnel indexes (1-based) or values <= 0

      a = v[v>0]          # get the tunnel positions

      b = sort(a)         # sort the tunnel positions ascending

      c1 = v[a]==b        # get the values of 'v' at positions 'a'
                          # and check if they're equal to the sorted positions 'b'
                          # (element-wise, returns a vector of TRUE/FALSE)

      c2 = a != b         # check if positions 'a' are different from sorted positions 'b' 
                          # (to exclude tunnels pointing to themselves, element-wise,
                          #  returns a vector of TRUE/FALSE)

      all(c1 & c2)        # if all logical conditions 'c1' and 'c2' are TRUE then
                          # returns TRUE otherwise FALSE
    }