Cod sursa(job #823330)

Utilizator iamdoruTanase Theodor iamdoru Data 24 noiembrie 2012 21:39:15
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include<stdio.h>
#include<stdlib.h>

struct node {
	int val;
	int ind;
	node* st;
	node* dr;
	node() {
	st=NULL;
	dr=NULL;
	}
};
node* insert (  node *a, int x, int i, node* begin,int sem) {
    node* aux;
	if(x>=a->val) {
        if(a->dr!=NULL)
            {
            sem=1;
            insert(a->dr,x,i,begin,sem);
        }else{
            aux=new node();
            aux->val=x;
            aux->ind=i;
            a->dr=aux;
            return begin;
        }
	}else {
        if(a->st!=NULL){
            if(sem==0)
                insert(a->st,x,i, a->st,sem);
            else
                insert(a->st,x,i,begin,sem);
        }else{
            aux=new node();
            aux->val=x;
            aux->ind=i;
            a->st=aux;
            return begin;
        }
	}
}
void search(node *q, int  x, int *t, int i, int *len) {
	if( q->val < x) {
		if(len[q->ind]+1 > len[i]) {
			len[i]= len[q->ind]+1;
			t[i]= q->ind;
		}
		if(q->dr!=NULL)
			search(q->dr,x,t,i,len);
	}
	if(q->st!=NULL)
		search(q->st,x,t,i,len);
}
void print(FILE*g, int start, int* t, int *p) {
    if(t[start]!=0) {
        print(g,t[start],t,p);
    }
    fprintf(g,"%d ",p[start]);
}

int main() {
	int n,i,start,max=0;
	int *p,*t,*len; 
	node **begin;
	node *root=NULL;

	//printf("%d\n %s\n %s\n",argc,args[argc-2], args[argc-1]);
	FILE *f,*g;
	f=fopen("scmax.in","r");
	fscanf(f,"%d",&n);
	p=(int*)malloc((n+2)*sizeof(int));
	t=(int*)calloc( n+2 , sizeof(int));
	len=(int*)malloc((n+2)*sizeof(int));
	begin = new node*[n+2];
	for(i=1;i<=n;i++) {
		fscanf(f,"%d",&p[i]);
		len[i]=1;
	}
	fclose(f);
    root= new node();
    root->val=p[1];
    root->ind=1;
	begin[1]=root;
	for(i=2;i<=n;i++) {
		begin[i]=insert(root,p[i],i,root,0);
	search(begin[i] ,p[i] , t ,i, len );
		if(len[i]>max) {
			start=i;
			max=len[i];
		}

	}

	g=fopen("scmax.out","w");
	fprintf(g,"%d\n",max);
	print(g,start,t,p);
	fprintf(g,"\n");
	fclose(g);

	return 0;
}