Cod sursa(job #442325)

Utilizator csizMocanu Calin csiz Data 14 aprilie 2010 09:50:32
Problema Subsir crescator maximal Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <fstream>
#include <list>
#include <vector>
#include <algorithm>
#include <stack>
#include <iostream>
using namespace std;


struct compara{
    int pos;
    vector<int> &numere;
    compara(int pos_,vector<int> &numere_):pos(pos_),numere(numere_){}
};
bool operator<(const compara& a,const compara& b){
    return a.numere[a.pos]<b.numere[b.pos];
}

int main(){
    ifstream in("scmax.in");
    ofstream out("scmax.out");

    int n;in>>n;
    vector<int> numere(n);
    vector<int> pred(n,-1);
    vector<int> marime(n,1);
    for(int i=0;i<n;i++) in>>numere[i];

    list<compara> pos;

    int maxim=0;

    for(int i=0;i<n;i++){
        compara temp(i,numere);
        list<compara>::iterator it=lower_bound(pos.begin(),pos.end(),temp);

        if(it!=pos.begin()){
            cout<<"mda";
            list<compara>::iterator prev=it;prev--;
            marime[i]=marime[prev->pos]+1;
            pred[i]=prev->pos;
            pos.insert(it,temp);

            if(marime[i]>marime[maxim]) maxim=i;
        }

    }

    out<<marime[maxim]<<endl;
    cout<<marime[maxim];
    stack<int> s;
    do{
        s.push(numere[maxim]);
        maxim=pred[maxim];
    }while(maxim!=-1);

    while(!s.empty()){
        out<<s.top()<<" ";
        s.pop();
    }
}