Pagini recente » Cod sursa (job #181282) | Cod sursa (job #1254444) | Cod sursa (job #1051684) | Cod sursa (job #2706616) | Cod sursa (job #1239699)
#include<fstream>
#include<iostream>
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
const int DMAX = 10009;
struct arb{
double m;
int sol;
};
arb v[DMAX*3];
int n,val2,poz,start,finish,maxim,lg[DMAX],sol2;
double valoare,s[DMAX];
void update(int nod,int left,int right)
{
if(left == right)
{
v[nod].m = valoare;
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(start <= left && right <= finish && v[nod].m < valoare && maxim < v[nod].sol +1 ){
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 citire()
{
in>>n;
double x;
for(int i = 1 ; i <= n ; i++)
{
in>>x;
s[i] = x;
poz = i;
valoare = x;
val2 = 0;
update(1,1,n);
}
val2 = 1;
valoare = s[1];
poz = 1;
update(1,1,n);
lg[1] = 1;
sol2 = 1;
}
void solve()
{
for(int i = 2 ; i <= n ; i++){
maxim = 1;
valoare = s[i];
start = 1;
finish = i-1;
query(1,1,n);
if(i == 2)
cout<<maxim;
lg[i] = maxim;
if(sol2 < maxim)
sol2 = maxim;
poz = i;
val2 = lg[i];
update(1,1,n);
}
out<<sol2;
}
int main()
{
citire();
solve();
return 0;
}