Pagini recente » Cod sursa (job #1537436) | Cod sursa (job #2610336) | Cod sursa (job #680747) | Cod sursa (job #2184091) | Cod sursa (job #804002)
Cod sursa(job #804002)
#include<fstream>
#include<iostream>
#include<algorithm>
#include<ctime>
using namespace std;
clock_t start=clock();
ifstream f("scmax.in");
ofstream g("scmax.out");
int N, K;
int A[100009];
int v[100009];
int res[100009];
int bst[100009];
int aib[100009];
int query(int idx)
{ int ans = 0;
while(idx)
{ if(bst[ans] < bst[aib[idx]])
ans = aib[idx];
idx -= (idx & -idx);
}
return ans;
}
void update(int idx, int i)
{ while(idx <= N)
{ if(bst[aib[idx]] < bst[i])
aib[idx] = i;
idx += (idx & -idx);
}
}
void write(int ind)
{ if(ind == 0) return;
write(v[ind]);
g<<res[ind]<<" ";
}
int main()
{ int i, j;
int ans = 0;
f>>N;
for(i = 1; i <= N; i++)
{ f>>A[i];
res[i] = v[i] = A[i];
}
sort(v + 1, v + N + 1);
for(i = 2, K = 1; i <= N; i++) //elimin duplicatele
if(v[i] != v[i - 1])
v[++K] = v[i];
for(i = 1; i <= N; i++)
A[i] = lower_bound(v + 1, v + K + 1, A[i]) - v;
for(i = 1; i <= N; i++)
{ j = query(A[i] - 1);
bst[i] = bst[j] + 1;
v[i] = j;
if(bst[ans] < bst[i]) ans = i;
update(A[i], i);
}
g<<bst[ans]<<'\n';
write(ans);
cout << 1.0*(clock()-start)/(1.0*CLOCKS_PER_SEC) << '\n';
return 0;
}