<?php
function
ceilIndex(&
$arr
,
$l
,
$r
,
$x
)
{
if
(
$l
>
$r
)
return
-1;
$mid
=
intval
(
$l
+ (
$r
-
$l
) / 2);
if
(
$arr
[
$mid
] ==
$x
)
return
$mid
;
if
(
$x
<
$arr
[
$mid
])
return
ceilIndex(
$arr
,
$l
,
$mid
- 1,
$x
);
return
ceilIndex(
$arr
,
$mid
+ 1,
$r
,
$x
);
}
function
revereseArr(&
$arr
,
$n
)
{
$i
= 0;
$j
=
$n
- 1;
while
(
$i
<
$j
)
{
$temp
=
$arr
[
$i
];
$arr
[
$i
] =
$arr
[
$j
];
$arr
[
$j
] =
$temp
;
$i
++;
$j
--;
}
}
function
getLBSLengthLogn(&
$arr
,
$n
)
{
if
(
$n
== 0)
return
0;
$increasing
=
array_fill
(0,
$n
, NULL);
$tail1
=
array_fill
(0,
$n
, NULL);
$decreasing
=
array_fill
(0,
$n
, NULL);
$tail2
=
array_fill
(0,
$n
, NULL);
$increasing
[0] =
$arr
[0];
$in
= 1;
$tail1
[0] = 0;
for
(
$i
= 1;
$i
<
$n
;
$i
++)
{
if
(
$arr
[
$i
] <
$increasing
[0])
{
$increasing
[0] =
$arr
[
$i
];
$tail1
[
$i
] = 0;
}
else
if
(
$arr
[
$i
] >
$increasing
[
$in
- 1])
{
$increasing
[
$in
++] =
$arr
[
$i
];
$tail1
[
$i
] =
$in
- 1;
}
else
{
$increasing
[ceilIndex(
$increasing
, -1,
$in
- 1,
$arr
[
$i
])] =
$arr
[
$i
];
$tail1
[
$i
] = ceilIndex(
$increasing
, -1,
$in
- 1,
$arr
[
$i
]);
}
}
$in
= 1;
revereseArr(
$arr
,
$n
);
$decreasing
[0] =
$arr
[0];
$tail2
[0] = 0;
for
(
$i
= 1;
$i
<
$n
;
$i
++)
{
if
(
$arr
[
$i
] <
$decreasing
[0])
{
$decreasing
[0] =
$arr
[
$i
];
$tail2
[
$i
] = 0;
}
else
if
(
$arr
[
$i
] >
$decreasing
[
$in
- 1])
{
$decreasing
[
$in
++] =
$arr
[
$i
];
$tail2
[
$i
] =
$in
- 1;
}
else
{
$decreasing
[ceilIndex(
$decreasing
, -1,
$in
- 1,
$arr
[
$i
])] =
$arr
[
$i
];
$tail2
[
$i
] = ceilIndex(
$decreasing
, -1,
$in
- 1,
$arr
[
$i
]);
}
}
revereseArr(
$arr
,
$n
);
revereseArr(
$tail2
,
$n
);
$ans
= 0;
for
(
$i
= 0;
$i
<
$n
;
$i
++)
if
(
$ans
< (
$tail1
[
$i
] +
$tail2
[
$i
] + 1))
$ans
= (
$tail1
[
$i
] +
$tail2
[
$i
] + 1);
return
$ans
;
}
$arr
=
array
(0, 8, 4, 12, 2, 10, 6, 14,
1, 9, 5, 13, 3, 11, 7, 15);
$n
= sizeof(
$arr
);
echo
getLBSLengthLogn(
$arr
,
$n
) .
"\n"
;
?>