Pagini recente » Cod sursa (job #3184971) | Cod sursa (job #122229) | Cod sursa (job #1000378) | Cod sursa (job #3194678) | Cod sursa (job #2254305)
#include <iostream>
#include <fstream>
#include <map>
const int MAXN = 1e5 + 5,MAX = 2e9;
using namespace std;
ifstream in("scmax.in");
ofstream out("scmax.out");
int tree[MAXN],scm[MAXN],ans[MAXN],n;
map<int,bool>mapa;
///tree = aib in sine
///scm retin lungime subsirul lui maxim care provine din subarbore
void tree_update(int nod,int left,int right){
if(!tree[left] || !tree[right])
tree[nod] = max(tree[left],tree[right]);
else
tree[nod] = min(tree[left],tree[right]);
if(tree[left] < tree[right])
scm[nod] = scm[left] + 1;
else
scm[nod] = max(scm[left],scm[right]);
}
void update(int pos,int value,int nod = 1,int left = 1,int right = n){
if(left == right){
tree[nod] = value;
scm[nod] = 1;
return;
}
int mid = (left + right) / 2;
if(pos <= mid)
update(pos,value,nod * 2,left,mid);
else
update(pos,value,nod * 2 + 1,mid + 1,right);
//cout<<nod<<" "<<tree[nod]<<" "<<tree[nod * 2]<<" "<<tree[nod * 2 + 1]<<endl;
tree_update(nod,nod * 2,nod * 2 + 1);
}
void query(int aux,int nod = 1,int left = 1,int right = n){
if(left == right || !aux)
return;
int mid = (left + right) / 2,leftkid = nod * 2,rightkid = nod * 2 + 1;
if(scm[leftkid] <= aux)
query(aux - 1,leftkid,left,mid);
else
query(aux - 1,rightkid,left,mid);
if(!ans[tree[nod]])
ans[tree[nod]] = aux;
}
int main()
{
in>>n;
for(int i = 1; i <= n; i++){
int x;
in>>x;
update(i,x);
}
/*cout<<endl;
for(int i = 1; i <= 9; i++)
cout<<tree[i]<<" ";
cout<<endl;
for(int i = 1; i <= 9; i++)
cout<<scm[i]<<" ";
cout<<endl;*/
out<<scm[1]<<"\n";
query(scm[1]);
return 0;
}