Pagini recente » Cod sursa (job #1572874) | Cod sursa (job #2132298) | Cod sursa (job #1993775) | Cod sursa (job #1693548) | Cod sursa (job #874933)
Cod sursa(job #874933)
#include<fstream>
#include<vector>
#include<algorithm>
#define INF (1 << 30)
#define FOR(i,a,b)\
for(int i=a; i<=b; ++i)
#define infile "scmax.in"
#define outfile "scmax.out"
#define nMax 100005
using namespace std;
ofstream g(outfile);
int v[nMax], vMin[nMax];
int Prev[nMax], Lg[nMax];
int N, Best;
void read(){
ifstream f(infile);
f >> N;
FOR(i,1,N)
f >> v[i];
f.close();
}
int search(int l, int r, int val){
int ret = 0;
while(l <= r){
int m = (l + r) / 2;
if(v[vMin[m]] < val){
ret = vMin[m];
l = m + 1;
}
else
r = m-1;
}
return ret;
}
void update(int i, int val){
if(v[i] < v[vMin[val]])
vMin[val] = i;
if(Lg[Best] < Lg[i])
Best = i;
}
void solve(){
v[0] = INF;
FOR(i,1,N){
int pos = search(1, i-1, v[i]);
Lg[i] = Lg[pos] + 1;
Prev[i] = pos;
update(i, Lg[i]);
}
}
void print(int pos){
if(!pos)
return;
print(Prev[pos]);
g << v[pos] << " ";
}
int main(){
read();
solve();
g << Lg[Best] << '\n';
print(Best);
g.close();
return 0;
}