#include <bits/stdc++.h> using namespace std; #define fru(j,n) for(int j=0; j<(n); ++j) #define tr(it,v) for(auto it=(v).begin(); it!=(v).end(); ++it) #define x first #define y second #define pb push_back #define ALL(G) (G).begin(),(G).end() //#define DEBUG #ifdef DEBUG #define DEB printf #else #define DEB(...) #endif typedef long long ll; typedef pair<int,int> pii; typedef vector<int> vi; const int inft = 1000000009; const int MAXN = 500006;//10^6 int A[MAXN],inv[MAXN]; vi PO,KO; bool bPO[MAXN],bKO[MAXN]; const int BAS=1<<19,U=2*BAS+5; pii D[U]; //max, -argmax int dod[U]; int POCZ[U],KON[U]; void go(int k,int a,int b,int val){ //dodaj val na tym przedziale if(a<=POCZ[k] && KON[k]<=b){ dod[k]+=val; D[k].x+=val; return; } if(a<=KON[2*k]) go(2*k,a,b,val); if(POCZ[2*k+1]<=b) go(2*k+1,a,b,val); D[k]=max(D[2*k],D[2*k+1]); D[k].x+=dod[k]; } pii PRZ[MAXN]; int main(){ POCZ[1]=0;KON[1]=BAS-1; for(int i=2;i<U;++i) if(i%2==0){ POCZ[i]=POCZ[i/2]; KON[i]=(POCZ[i/2]+KON[i/2])/2; } else { POCZ[i]=(POCZ[i/2]+KON[i/2])/2+1; KON[i]=KON[i/2]; } fru(i,BAS) D[i+BAS]=pii(0,-i); int n; scanf("%d",&n); fru(i,n) scanf("%d",&A[i]); fru(i,n) --A[i]; fru(i,n) inv[A[i]]=i; fru(i,n) if(PO.empty() || A[i]>PO.back()) PO.pb(A[i]); fru(i,n){ while(!KO.empty() && KO.back()>A[i]) KO.pop_back(); KO.pb(A[i]); } if(PO.size()==n) { printf("Cool Array\n"); return 0; } DEB("PO:"); tr(it,PO) DEB("%d ",*it); DEB("\n"); DEB("KO:"); tr(it,KO) DEB("%d ",*it); DEB("\n"); tr(it,PO) bPO[*it]=1; tr(it,KO) bKO[*it]=1; int bestval=-1; pii bestpos(-1,-1); int last=0; fru(i,KO.size()) if(bPO[KO[i]]==0) go(1,i,i,1); fru(i,n) if(bKO[i]==0){ if(bPO[i]){ while(last<inv[i]){ int e=A[last]; assert(e<i); if(bPO[e]==0){ DEB("zapominam o gosciu %d na prz: %d %d\n",e,PRZ[e].x,PRZ[e].y); if(bKO[e]==0) go(1,PRZ[e].x,PRZ[e].y,-1); else { int w=lower_bound(ALL(KO),e)-KO.begin(); go(1,w,w,-1); } } ++last; } DEB("rozwazam poczatek w %d i kandydat: (%d,%d)\n",i,D[1].x,D[1].y); if(D[1].x>bestval){ bestval=D[1].x; bestpos=pii(inv[i],inv[KO[-D[1].y]]); } } else{ //jestem w gosciu ktory nie jest ani w PO ani w KO DEB("val = %d\n",i); int p=0,k=KO.size(); while(p+1<k){ int m=(p+k)/2; if(KO[m]>i) k=m; else p=m; } int kon=p;//ostatni do ktorego moge dodac assert(KO[kon]<i); int pocz=0; //musi byc jeszcez na prawo if(inv[KO[0]]<inv[i]){ p=0,k=KO.size(); while(p+1<k){ int m=(p+k)/2; if(inv[KO[m]]<inv[i]) p=m; else k=m; } pocz=k; } DEB("dla goscia %d dodaje na przedziale %d %d\n",i,pocz,kon); assert(pocz<=kon); PRZ[i]=pii(pocz,kon); go(1,pocz,kon,1); } } printf("%d %d\n",bestpos.x+1,bestpos.y+1); return 0; }