Pagini recente » Cod sursa (job #884946) | Cod sursa (job #1899244) | Cod sursa (job #1534821) | Cod sursa (job #2240247) | Cod sursa (job #1239660)
#include<fstream>
#include<iostream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int DMAX = 100005;
struct arb{
int sol,m,p;
};
arb v[3*DMAX];
int n,val,poz,val2,start,finish,val3,lg[DMAX],maxim,poz2,lungime,s[DMAX],rec[DMAX],sol_glob,poz_glob;
void update(int nod,int left,int right)
{
if(left == right){
v[nod].m = val;
v[nod].p = poz;
v[nod].sol = val2;
return;
}
int mij = (left+right)/2;
if(poz <= mij) update(nod*2,left,mij);
else update(nod*2+1,mij+1,right);
if(v[nod*2].sol >= v[nod*2+1].sol)
v[nod] = v[nod*2];
else
v[nod] = v[nod*2+1];
}
void query(int nod,int left,int right)
{
if(left <= start && finish >= right && v[nod].m > val3 && v[nod].sol+1 > maxim){
maxim = v[nod].sol + 1;
poz2 = v[nod].p;
return;
}
if(left == right)
return;
int mij = (left+right)/2;
if(start <= mij) query(nod*2,left,mij);
if(finish > mij) query(nod*2+1,mij+1,right);
}
void citire()
{
in>>n;
int x;
for(int i = 1 ; i <= n-1 ; i++)
{
in>>x;
s[i] = x;
poz = i;
val = x;
val2 = 0;
update(1,1,n);
}
in>>x;
s[n] = x;
poz = n;
val = x;
val2 = 1;
update(1,1,n);
lg[n] = 1;
rec[n] = -1;
sol_glob = 1;
poz_glob = n;
}
void solve()
{
for(int i = n-1 ; i >= 1 ; i--){
maxim = 1;
val3 = s[i];
poz2 = -1;
start = i+1;
finish = n;
query(1,1,n);
lg[i] = maxim;
rec[i] = poz2;
if(sol_glob < lg[i]){
sol_glob = lg[i];
poz_glob = i;
}
poz = i;
val = s[i];
val2 = lg[i];
update(1,1,n);
}
out<<sol_glob<<"\n";
for(int i = 1 ; i <= sol_glob ; i ++){
out<<s[poz_glob]<<" ";
poz_glob = rec[poz_glob];
}
out.close();
}
int main()
{
citire();
solve();
return 0;
}