Cod sursa(job #2254305)

Utilizator nicolaefilatNicolae Filat nicolaefilat Data 4 octombrie 2018 23:09:36
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#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;
}