Pagini recente » Cod sursa (job #245739) | Cod sursa (job #1606685) | Cod sursa (job #2669738) | Cod sursa (job #723428) | Cod sursa (job #1240570)
#include<fstream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int DMAX = 100009;
struct arbore{
int m;
int sol;
};
arbore v[3*DMAX];
int n,val,val2,poz,maxim,start,finish,sol_glob;
void update(int nod,int left,int right)
{
if(left == right){
v[nod].m = val;
v[nod].sol = val2;
return;
}
int mij = (left+right)/2;
if(poz <= mij) update(nod*2,left,mij);
else update(2*nod+1,mij+1,right);
if(v[nod*2+1].sol > v[nod*2].sol)
v[nod] = v[nod*2+1];
else v[nod] = v[nod*2];
}
void query(int nod,int left,int right)
{
if(start <= left && right <= finish && val > v[nod].m && v[nod].sol+1 > maxim){
maxim = v[nod].sol+1;
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 solve()
{
in>>n;
int x;
in>>x;
val = x;
val2 = 1;
poz = 1;
update(1,1,n);
for(int i = 2 ; i <= n ; i++)
{
in>>x;
maxim = 1;
start = 1;
finish = i-1;
val = x;
query(1,1,n);
val = x;
val2 = maxim;
poz = i;
update(1,1,n);
if(sol_glob < maxim)
sol_glob = maxim;
}
out<<sol_glob;
}
int main()
{
solve();
}