#include using namespace std; #pragma GCC optimize("O3") #define rep(i,n) for (int i=0;i<(n);i++) #define pii pair #define st first #define nd second #define all(V) V.begin(), V.end() const int rozmiar=(1<<18); struct drzewo_mak { int tab [2*rozmiar]; drzewo_mak() { fill(tab, tab+2*rozmiar,-1); } int get(int p, int q) { p+=rozmiar; q+=rozmiar; int wynik=-1; while (p<=q) { if(p%2==1) { wynik=max(wynik, tab[p]); p++; } if(q%2==0) { wynik=max(wynik, tab[q]); q--; } p=p/2; q=q/2; } return wynik; } void add(int p, int val) { p+=rozmiar; while(p>0) { tab[p]=max(tab[p],val ); p=p/2; } } }; struct drzewo_min { int tab [2*rozmiar]; const int inf=1e9; drzewo_min() { fill(tab, tab+2*rozmiar,inf); } int get(int p, int q) { p+=rozmiar; q+=rozmiar; int wynik=inf; while (p<=q) { if(p%2==1) { wynik=min(wynik, tab[p]); p++; } if(q%2==0) { wynik=min(wynik, tab[q]); q--; } p=p/2; q=q/2; } return wynik; } void add(int p, int val) { p+=rozmiar; while(p>0) { tab[p]=min(tab[p],val ); p=p/2; } } }; set< vector > ans; vector wartosci; int n; map > M; void obr(vector &A) { int a=*max_element(all(A)); a++; for (int &b:A) b=a-b; } void wrzuc (set > S, bool obro=false) { for (auto V:S) { if(obro) obr(V); ans.insert(V); } } void obroc() { rep(i, n) wartosci[i]=rozmiar-wartosci[i]; M.clear(); rep(i,n) M[wartosci[i]].push_back(i); } void print() { for (auto V: ans) { for (int a:V) cout < > solve1() { set > tmp; set liczby; drzewo_mak D1; drzewo_mak D2; drzewo_min D3; for (int a: wartosci) { //cerr<a) tmp.insert({1,3,2}); if(D3.get(a+1, rozmiar-1) > solve2() { set > tmp; drzewo_mak D; rep(i,n) D.add(i,wartosci[i]); for (auto P:M) { int a=P.st; auto V=P.nd; int sz=V.size(); if(sz<2) continue; if(D.get(V[0],V.back())>a) tmp.insert({1,2,1}); if(D.get(V[1], n)>a) tmp.insert({1,1,2}); if(D.get(0,V[sz-2])>a) tmp.insert({{2,1,1}}); } return tmp; } void pre() { cin>>n; vector tmp; wartosci.resize(n); rep(i,n) cin>>wartosci[i]; tmp=wartosci; sort(all(tmp)); tmp.erase(unique(all(tmp)), tmp.end()); rep(i,n) { wartosci[i]=lower_bound(all(tmp), wartosci[i])-tmp.begin()+2; M[wartosci[i]].push_back(i); if(M[wartosci[i]].size()>=3) ans.insert({1,1,1}); } } main() { pre(); wrzuc(solve1(),true); // print(); wrzuc(solve2()); // print(); obroc(); wrzuc(solve1()); // print(); wrzuc(solve2(),true); //cout <