Pagini recente » Cod sursa (job #382537) | Cod sursa (job #1625338) | Cod sursa (job #1822347) | Cod sursa (job #1541126) | Cod sursa (job #2058572)
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Stack;
public class Main {
static int[] v;
static ArrayList<Integer> seq;
static int binarySearch(int from, int to, int val) {
if(from < to) {
int mid = (from + to + 1) / 2;
if(v[seq.get(mid)] < val)
return binarySearch(mid, to, val);
else
return binarySearch(from, mid - 1, val);
} else
return from;
}
public static void main(String[] args) throws FileNotFoundException, IOException {
Scanner in = new Scanner(new BufferedReader(new FileReader("scmax.in")));
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("scmax.out")));
int n = in.nextInt();
v = new int[n];
int[] parent = new int[n];
for(int i=0; i<n; i++) {
v[i] = in.nextInt();
parent[i] = -1;
//out.println(v[i]);
}
seq = new ArrayList<>();
seq.add(0);
for(int i=1; i<n; i++) {
if(v[i] <= v[seq.get(0)])
seq.set(0, i); //I am hoping to find v[i] + 1, v[i] + 2 ... seq.get(0) next, so that I can build a longer sequence
else {
int index = binarySearch(0, seq.size() - 1, v[i]) + 1;
if(index >= seq.size())
seq.add(i);
else
seq.set(index, i);
parent[i] = seq.get(index - 1);
}
}
Stack<Integer> st = new Stack<>();
int el = seq.get(seq.size() - 1);
while(el > 0) {
st.push(v[el]);
el = parent[el];
}
out.println(st.size());
while(!st.isEmpty()) {
out.print(st.pop() + " ");
}
in.close();
out.close();
}
}