Cod sursa(job #1780433)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 16 octombrie 2016 11:00:23
Problema Subsir crescator maximal Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <stdio.h>
#include <ctype.h>
#define LIM 1<<7
int v[100001], u[100001], ord[100001], PUTERE;
FILE *fi, *fo;

int a, b, poz=LIM, poz2=0;
char BUF[LIM], BUF2[LIM];

inline char getChar(){
  poz++;
  if(poz>=LIM){
    fread(BUF,LIM,1,fi);
    poz=0;
  }
  return BUF[poz];
}

inline int getNr(){
  int r=0, semn=1;
  char ch=getChar();
  while(isdigit(ch)==0 && ch!='-') ch=getChar();
  if(ch=='-'){
    semn=-1;
    ch=getChar();
  }
  while(isdigit(ch)!=0){
    r=r*10+semn*(ch-'0');
    ch=getChar();
  }
  return r;
}

inline void putch(char ch){
  BUF2[poz2++]=ch;
  if(poz2==LIM){
    fwrite(BUF2,LIM,1,fo);
    poz2=0;
  }
}

inline void baga(int x){
  char s[15];
  int k=0;
  if(x<0){
    putch('0');
    return;
  }
  do{
    s[k++]=x%10+'0';
    x/=10;
  }while(x);
  while(k>0){
    k--;
    putch(s[k]);
  }
}

void afis(int i){
  if(ord[i]!=0)
    afis(ord[i]);
  baga(u[i]);
  putch(' ');
}

inline int CB(int x){
  int pas=PUTERE, rez=0;
  for(pas/=2;pas>0;pas/=2)
    if(v[rez+pas]!=0 && x>u[v[rez+pas]])
      rez+=pas;
  return rez;
}

int main()
{
  int n, i, poz, max=0;
  fi=fopen("scmax.in", "r");
  fo=fopen("scmax.out", "w");
  n=getNr();
  PUTERE=1;
  while(PUTERE<n)
    PUTERE*=2;
  for(i=1;i<=n;i++)
    u[i]=getNr();
  for(i=1;i<=n;i++){
    poz=CB(u[i]);
    v[poz+1]=i;
    ord[i]=v[poz];
    if(poz+1>max)
      max=poz+1;
  }
  baga(max);
  putch('\n');
  afis(v[max]);
  if(poz2>0)
    fwrite(BUF2,poz2,1,fo);
  fclose(fi);
  fclose(fo);
  return 0;
}