Cod sursa(job #1742392)

Utilizator Dan_RadulescuRadulescu Dan Dan_Radulescu Data 16 august 2016 13:26:26
Problema Subsir crescator maximal Scor 20
Compilator cpp Status done
Runda Arhiva educationala Marime 1.02 kb
#include<stdio.h>
using namespace std;
FILE *f1=fopen("scmax.in","r");
FILE *f2=fopen("scmax.out","w");
int n,i,a[100001],aib[100001],maxs,Max,start,val,j,t[100001];
void creare(int i){
    int index;
    index=i;
    aib[i]=val;
    index=index+(index&(-index));
    while(index<=n){
        if (a[i]<a[index]) aib[index]=val;
        index=index+(index&(-index));
    }
}
void maxim(int i){
   int index=i;
   while(index>0){
      if (maxs<aib[index] && a[i+1]>a[index]) {
            maxs=aib[index];
            t[i+1]=index;
      }
      index=index-(index&(-index));
   }
}
void afis(int i){
    if (t[i]!=0) afis(t[i]);
    fprintf(f2,"%d ",a[i]);
}
int main(){
   fscanf(f1,"%d",&n);
   for (i=1;i<=n;i++)
      fscanf(f1,"%d",&a[i]);
   fclose(f1);
   for (i=1;i<=n;i++){
      maxs=0;
      maxim(i-1);
      val=1+maxs;
      if (Max<val){
         Max=val;
         start=i;
      }
      creare(i);
   }
   fprintf(f2,"%d\n",Max);
   afis(start);
   fclose(f2);
   return 0;
}