Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define ever (;;)
- FILE *in = fopen("torturi.in", "r"), *out = fopen("torturi.out", "w") ;
- const int MV = 25e4 ;
- int firstStack, secondStack ;
- int blat[MV] ;
- int new_blat[MV] ;
- int last[MV] ;
- int lis[MV] ;
- int pred[MV] ;
- int ans, n ;
- int best(int l, int r, int key) {
- while (r - l > 1) {
- int mij((l + r) >> 1) ;
- if (blat[last[mij]] < key) {
- r = mij ;
- } else l = mij ;
- }
- return r ;
- }
- int LIS() {
- last[1] = blat[1] ;
- lis[1] = 1 ;
- int len(0) ;
- for (int i = 2 ; i <= n ; ++ i) {
- if (blat[i] <= blat[last[len]]) {
- pred[i] = last[len] ;
- last[++ len] = i ;
- } else {
- int poz = best(-1, len, blat[i]) ;
- last[poz] = i ;
- pred[i] = last[poz - 1] ;
- }
- }
- return len + 1 ;
- }
- void afisare(int vv[], int sz) {
- for (int i = 1 ; i <= sz ; ++ i) {
- std::cerr << vv[i] << ' ' ;
- }
- std::cerr << '\n' ;
- }
- void get_new_blat(int start) {
- start = last[start - 1] ;
- std::vector<int> scot ;
- for ever {
- scot.push_back(start) ;
- start = pred[start] ;
- if (!start) {
- break ;
- }
- }
- int index = scot.size() - 1 ;
- int blaturi(0) ;
- for (int i = 1 ; i <= n ; ++ i) {
- if (scot[index] == blat[i]) {
- index ++ ;
- continue ;
- }
- new_blat[++ blaturi] = blat[i] ;
- }
- afisare(new_blat, blaturi) ;
- }
- int main() {
- fscanf(in, "%d", &n) ;
- for (int i = 1 ; i <= n ; ++ i) {
- fscanf(in, "%d", blat + i) ;
- }
- int ans = LIS() ;
- get_new_blat(ans) ;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement