1136 Parliament Timus OJ Solution

#include <iostream>
#include <vector>
#include <bitset>
#include <cstdio>
using namespace std;
vector<int> a;
struct node{
    int val;
    struct node *parent,*left,*right;
};
vector<node> b(3001);
void find(node* root,int l,int r,int &k){
    if(l>r)return;
    if(l==r){
        if(root->val>a[l])
            root->left=NULL,root->right=&b[k];
        else root->left=&b[k],root->right=NULL;
        b[k].parent=root;
        b[k].left=b[k].right=NULL;
        b[k].val=a[l];
        k++;
        return;
    }
    int i=l;
    for(;i<=r;i++)
        if(a[i]>root->val)
            break;
    if(i==l){
        root->left=NULL;
        root->right=&b[k];
        b[k].parent=root;
        b[k].val=a[r];
        k++;
        find(&b[k-1],l,r-1,k);
    }
    else if(i>r){
        root->right=NULL;
        root->left=&b[k];
        b[k].parent=root;
        b[k].val=a[r];
        k++;
        find(&b[k-1],l,r-1,k);
    }
    else{
        i--;
        b[k].val=a[i];
        b[k].parent=root;
        root->left=&b[k];
        k++;
        find(&b[k-1],l,i-1,k);
        b[k].val=a[r];
        b[k].parent=root;
        root->right=&b[k];
        k++;
        find(&b[k-1],i+1,r-1,k);
    }
}
int main(){
    int n;
    cin>>n;
    for(int i=0;i<n;i++){
        int x;
        cin>>x;
        a.push_back(x);
    }
    node* root=new node();
    root->val=a[n-1];
    int k=0;
    find(root,0,n-2,k);
    // cout<<n<<' '<<k<<endl;
    // for(int i=0;i<k;i++)
    //     cout<<b[i].val<<endl;
    for(int i=k-1;i>=0;i--)
        cout<<b[i].val<<endl;
    cout<<root->val<<endl;
}

Comments