#!/usr/bin/env python3 # Modul na binární vyhledávání ze standardní knihovny: import bisect # Načteme vstup. Od pozic odečteme jedničku, protože je chceme číslovat od nuly. n = int(input()) P = [int(input()) - 1 for _ in range(n)] # V `nejnizsi[k]` si udržujeme, na jakou nejnižší hodnotu může končit rostoucí # podposloupnost délky `k` (pro zatím prošlou část pole). nejnizsi = [] # V `zaznam[i]` si ukládáme, jakou hodnotu pole `nejnizsi` jsme upravili v # i-tém kroku. zaznam = [] for x in P: # Najdeme i takové, že nejnizsi[i - 1] < x <= nejnizsi[i] i = bisect.bisect_left(nejnizsi, x) if i == len(nejnizsi): # Prodlužujeme dosud nejdelší rostoucí posloupnost, potřebujeme přidat # dummy prvek. nejnizsi.append(None) nejnizsi[i] = x zaznam.append(i) # Hledáme největší `k`, pro které je `nejnizsi[k]` spočítané, což je přesně # `len(nejnizsi) - 1`, plus `1` za indexování od jedničky. print(len(nejnizsi)) # Teď projdeme záznam pozpátku a sledujeme pozici posloupnosti, ze které se na # konci stane NPR. Na začátku je na poslední pozici v poli a pokaždé, když z # aktuálního záznamu vyplývá, že jsme v aktuálním kroku NPR prodloužili, # snížíme `npr` o jedna. npr = len(nejnizsi) - 1 res = [] # enumerate(seznam) vrací iterátor (0, seznam[0]), (1, seznam[1]), … for i, a in reversed(list(enumerate(zaznam))): # Pokud aktuální akce prodloužila podposloupnost, ze které se na konci stane NPR: if a == npr: # + 1 kvůli číslování od nuly res.append(i + 1) npr -= 1 print(" ".join(map(str, reversed(res))))