template
<
class
?T
>
?
int
?FindLIS(T?
*
arr,?
int
?len,?T?
*&
result)
{
????
int
?
*
last?
=
?
new
?
int
[len]();
????
int
?
*
track?
=
?
new
?
int
[len]();
????
int
?left,?right,?mid;
????
int
?iCurrMaxLen?
=
?
0
;
????
if
?(len?
<
?
1
)
????
{
????????result?
=
?
0
;
????????
return
?
0
;
????}
????result?
=
?
0
;
????last[
0
]?
=
?
0
;
????
for
?(
int
?i?
=
?
1
;?i?
<
?len;?i
++
)?
????
{
????????
if
?(arr[last[iCurrMaxLen]]?
<
?arr[i])
????????
{
????????????track[i]?
=
?last[iCurrMaxLen];
????????????last[
++
iCurrMaxLen]?
=
?i;
????????????
continue
;
????????}
????????left?
=
?
0
;
????????right?
=
?iCurrMaxLen;
????????
while
?(left?
<
?right)
????????
{
????????????mid?
=
?(left?
+
?right)?
/
?
2
;
????????????arr[last[mid]]?
<
?arr[i]?
?
?left?
=
?mid?
+
?
1
?:?right?
=
?mid;
????????}
????????
if
?(
/**/
/*
left?<=?right?&&?
*/
arr[i]?
<
?arr[last[left]])?
????????
{
????????????
if
?(left?
>
?
0
)?
????????????????track[i]?
=
?last[left?
-
?
1
];
????????????last[left]?
=
?i;
????????}
????}
//
for
????
for
?(left?
=
?iCurrMaxLen,?right?
=
?last[iCurrMaxLen];?left?
>=
?
0
;?left
--
,?right?
=
?track[right])
????????last[left]?
=
?arr[right];
????
if
?(track)
????
{
????????delete?[]?track;
????????track?
=
?
0
;
????}
????result?
=
?last;
????last?
=
?
0
;
????
return
?iCurrMaxLen?
+
?
1
;
}


