#include<iostream> #include<fstream> #include<algorithm> #include<cstring> #include<vector> #include<string> #include<queue> #include<cstdlib> #include<ctime> #define in cin #define out cout using namespace std; typedef long long ll; const int Nmax = 500001; struct vals{ int x,ind; } v[Nmax]; struct per{ int val; per *st,*dr; }; per *R[Nmax]; struct cmp{ inline bool operator () (const vals &a,const vals &b) const { return a.x<b.x; } }; int N,aa[Nmax],ans[Nmax],wh[Nmax]; int inv[Nmax],u[2][Nmax]; int m=-1,ax,ay; per* build(int st,int dr){ per *u=new per(); u->val=0; if(st < dr){ int mij=(st+dr)/2; u->st=build(st,mij); u->dr=build(mij+1,dr); } return u; } per* update(per* t,int st,int dr,int wh){ per *u=new per(); u->val=t->val+1; if(st < dr){ int mij=(st+dr)/2; if(wh<=mij){ u->st=update(t->st,st,mij,wh); u->dr=t->dr; } else{ u->st=t->st; u->dr=update(t->dr,mij+1,dr,wh); } } return u; } int query(per *t,int st,int dr,int a,int b){ if(a<=st && dr<=b) return t->val; else{ int mij=(st+dr)/2; if(b<=mij) return query(t->st,st,mij,a,b); else if(a>mij) return query(t->dr,mij+1,dr,a,b); else{ int a1 = query(t->st,st,mij,a,mij); int a2 = query(t->dr,mij+1,dr,mij+1,b); return a1+a2; } } } int value(int i,int j){ if(i>j) swap(i,j); if(i==j) return -1; if(aa[i]<aa[j]) return -1; int a1 = query(R[aa[i]],1,N,i,j); int a2 = query(R[aa[j]],1,N,i,j); return a1-a2; } void check(int i,int j){ if(i>j) swap(i,j); if(aa[i]>aa[j]){ int g=value(i,j); if(g>m) m=g,ax=i,ay=j; else if(g==m){ if(i<ax) ax=i,ay=j; else if(i==ax && j<ay) ax=i,ay=j; } } } void tr(int st,int dr,int a,int b){ int mij=(st+dr)/2; int be=-2,bei; for(int i=a;i<=b;i++){ int g=value(mij,wh[i]); if(g>be) be=g,bei=i; } ans[mij]=bei; if(st<dr){ tr(st,mij,a,ans[mij]); tr(mij+1,dr,ans[mij],b); } } int main(){ in>>N; int co=1; for(int i=1;i<=N;i++){ in>>aa[i]; if(aa[i]!=i) co=0; v[i].x=aa[i],v[i].ind=i; wh[v[i].x]=i; } if(co){out<<"Cool Array\n";return 0;} sort(v+1,v+N+1,cmp()); R[0]=build(1,N); for(int i=1;i<=N;i++){ R[i]=update(R[i-1],1,N,v[i].ind); inv[ v[i].ind ] = v[i].ind - query(R[i],1,N,1,v[i].ind); } int maxx=0,minn=Nmax+2; for(int i=1;i<=N;i++){ maxx=max(maxx,inv[i]); minn=min(minn,inv[i]); } for(int i=1;i<=N;i++){ if(inv[i]==maxx) u[0][++u[0][0]]=i; if(inv[i]==minn) u[1][++u[1][0]]=i; } for(int i=1;i<=u[0][0];i++){ for(int j=1;j<=u[1][0];j++){ check(u[0][i],u[1][j]); } } out<<ax<<' '<<ay<<'\n'; return 0; }