Cod sursa(job #812234)

Utilizator RoflmaoPatru Ovidiu Roflmao Data 13 noiembrie 2012 17:54:19
Problema Subsir crescator maximal Scor 0
Compilator c Status done
Runda Arhiva educationala Marime 1.04 kb
#include<stdlib.h>
#include<stdio.h>

FILE *g;

void afisare(int nr, int P[],int n, int V[]) {	
	int i,temp[nr+1],nr2=nr;
	fprintf(g,"%i\n", nr);
	for(i=n;nr>0;i--)
		if(P[i]==nr)
		{
			temp[nr]=V[i];	
			nr--;
		}
	for(i=1;i<=nr2;i++)
		fprintf(g,"%i ", temp[i]);		
}

int pozitie(int x, int Q[], int *nr) {
	int p,u,m;
	p=1; u=*nr; m=(u+p)/2;
	if(Q[*nr]<x) {
		*nr=*nr+1;
		return *nr;
	}
	while(p<=u) {
		if(Q[m] < x && Q[m+1] >= x)
			return m;
		else
			if(Q[m+1] < x) {
				p=m+1;
				m=(p+u)/2;
			}
			else {
				u=m-1;
				m=(p+u)/2;
			}
	}
	return *nr;
}


void P3(int V[],int n) {
	int P[n+1],Q[n+1];
	int i,poz,nr;
	Q[0]=0; Q[1]=V[1]; P[1]=1; nr=1;
	for(i=2;i<=n;i++) {
		poz=pozitie(V[i],Q,&nr);
		Q[poz]=V[i];
		P[i]=poz;
	}
	afisare(nr,P,n,V);	
}
int main() {
 		char *fintrare, *fiesire;
		fintrare ="grader_test1.in";
		fiesire ="scmax.out";
		int n,V[100001];	
		FILE *f;
		f=fopen(fintrare,"rt");	
		fscanf(f,"%i",&n);
		int i;
		for(i=1; i<=n; i++)
			fscanf(f,"%i", &V[i]);
		fclose(f);
		g=fopen(fiesire,"wt");
		P3(V,n);
		fclose(g);
}