Pagini recente » Cod sursa (job #2399144) | Cod sursa (job #3135652) | Cod sursa (job #1459686) | Cod sursa (job #1547494) | Cod sursa (job #2867860)
#include <bits/stdc++.h>
#define x(i) (i&(-i))
using namespace std;
ifstream fin("scmax.in");
ofstream fout("scmax.out");
const int NMAX = 100005;
const int VALMAX = 2000000005;
int a[NMAX],b[NMAX],c[NMAX],pre[NMAX];
pair<int, int> aib[NMAX];
int dp[NMAX], previous[NMAX];
int n;
unordered_map<int, int> norm_map;
int rev_norm_map[NMAX];
void citire(){
fin >> n;
for(int i=1;i<=n;i++)
fin >> a[i];
}
void normalizare(){
for(int i=1;i<=n;i++)
b[i] = a[i];
sort(b+1, b+n+1);
int curr = 0;
for (int i = 1; i <= n; ++i) {
if (!norm_map.count(b[i])) {
norm_map[b[i]] = ++curr;
rev_norm_map[curr] = b[i];
}
}
for(int i=1;i<=n;i++)
a[i]=norm_map[a[i]];
// b = a;
// sort(b.begin(), b.end());
// b.erase(unique(b.begin(), b.end()), b.end());
// for (int i = 1; i <= n; ++i)
// norm_map[b[i]] = i;
}
void update_aib(int poz, pair<int, int> val){
for(int i=poz;i<=n;i+=x(i))
aib[i]=max(aib[i],val);
return;
}
pair<int, int> query_aib(int poz){
pair<int, int> maxim(0, 0);
for(int i=poz;i>=1;i-=x(i)){
maxim=max(maxim,aib[i]);
}
return maxim;
}
void solve(){
dp[1]=1;
update_aib(a[1], make_pair(dp[1], 1));
for(int i=2;i<=n;i++){
pair<int, int> maxim = query_aib(a[i]-1);
dp[i]=maxim.first + 1;
previous[i] = maxim.second;
update_aib(a[i], make_pair(dp[i], i));
}
}
void afis(){
int rasp=0,ind=0;
for(int i=1;i<=n;i++){
if(dp[i]>rasp){
rasp=dp[i];
ind=i;
}
}
fout << rasp << '\n';
vector<int> v;
v.reserve(rasp);
for (int i = ind; i; i = previous[i])
v.push_back(i);
reverse(v.begin(), v.end());
for (int it : v)
fout << rev_norm_map[a[it]] << " ";
}
int main()
{
citire();
normalizare();
solve();
afis();
return 0;
}