#include <cstdlib> #include <cstdio> #include <algorithm> #include <vector> #include <queue> #include <cmath> #include <stack> #include <map> #include <set> #include <deque> #include <cstring> #include <functional> #include <climits> #include <list> #include <ctime> #include <complex> #define F1(x,y,z) for(int x=y;x<z;x++) #define F2(x,y,z) for(int x=y;x<=z;x++) #define F3(x,y,z) for(int x=y;x>z;x--) #define F4(x,y,z) for(int x=y;x>=z;x--) #define pb push_back #define LL long long #define co complex<double> #define MAX 500005 #define AMAX 16384 #define MOD 1000000007 #define f(c,d) ((1<<(c))*(d)) using namespace std; int n,v[MAX],ia,ib,dx,i,ra[MAX],rb[MAX],qa; pair<int,int> x[MAX],y[MAX]; vector<int> ltx,rbx; //x-coord of left-top/right-bottom line bool ok=1; pair<int,int> re,pt,ans; //-v,rbx[i] priority_queue<int> z,zz; bool ll[MAX],rr[MAX]; vector<pair<int,int> > seg[20]; vector<int> add[20]; int ansv=1; pair<int,int> f1(int a,int b,int c,int d){ //if(c==19)printf("%d %d %d %d\n",a,b,c,d); if(f(c,d)==a&&f(c,d+1)==b){ //printf("A %d %d %d %d\n",a,b,c,d); //printf("%d %d\n",seg[c][d].first,add[c][d]); return seg[c][d]; } c--; d=d*2+1; add[c][d-1]+=add[c+1][d/2]; seg[c][d-1].first+=add[c+1][d/2]; if(f(c,d)<=rbx.size()){ add[c][d]+=add[c+1][d/2]; seg[c][d].first+=add[c+1][d/2]; } add[c+1][d/2]=0; if(b<=f(c,d))return f1(a,b,c,d-1); if(a>=f(c,d))return f1(a,b,c,d); return min(f1(a,f(c,d),c,d-1),f1(f(c,d),b,c,d)); } void f2(int a,int b,int c,int d,int e){ //if(c==19)printf("%d %d %d %d %d\n",a,b,c,d,e); //printf("%d %d\n",seg[c].size(),add[c].size()); if(f(c,d)==a&&f(c,d+1)==b){ // printf("B %d %d %d %d %d\n",a,b,c,d,e); // printf("%d %d\n",seg[c][d].first,add[c][d]); seg[c][d].first+=e; add[c][d]+=e; //printf("%d %d\n",seg[c][d].first,add[c][d]); return; } c--; d=d*2+1; add[c][d-1]+=add[c+1][d/2]; seg[c][d-1].first+=add[c+1][d/2]; if(f(c,d)<=rbx.size()){ add[c][d]+=add[c+1][d/2]; seg[c][d].first+=add[c+1][d/2]; } add[c+1][d/2]=0; if(b<=f(c,d))f2(a,b,c,d-1,e); else if(a>=f(c,d))f2(a,b,c,d,e); else{ f2(a,f(c,d),c,d-1,e); f2(f(c,d),b,c,d,e); } seg[c+1][d/2]=seg[c][d-1]; if(f(c,d)<=rbx.size())seg[c+1][d/2]=min(seg[c+1][d/2],seg[c][d]); } int main(){ scanf("%d",&n); F2(a,1,n)scanf("%d",&v[a]); F2(a,1,n){ if(v[a]!=a)ok=0; x[a]=make_pair(a,v[a]); y[a]=make_pair(v[a],a); } if(ok){ printf("Cool Array\n"); return 0; } //sort(x+1,x+n+1); sort(y+1,y+n+1); ltx.pb(1); F2(a,2,n)if(x[a].second>v[ltx.back()])ltx.pb(x[a].first); rbx.pb(y[1].second); F2(a,2,n)if(y[a].second>rbx.back())rbx.pb(y[a].second); //F1(a,0,ltx.size())printf("%d%c",ltx[a],a==ltx.size()-1?'\n':' '); //F1(a,0,rbx.size())printf("%d%c",rbx[a],a==rbx.size()-1?'\n':' '); F1(a,0,20)for(int b=0;f(a,b)<=rbx.size();b++){ add[a].pb(0); seg[a].pb(make_pair(0,f(a,b))); } F1(a,0,ltx.size())ll[ltx[a]]=1; F1(a,0,rbx.size())rr[rbx[a]]=1; i=0; F2(a,1,n){ if(rr[a])i++; else ra[a]=i; } i=0; F2(a,1,n){ if(rr[y[a].second])i++; else rb[y[a].second]=i; } //F2(a,1,n)printf("%d %d %d\n",a,ra[a],rb[a]); F2(a,1,n){ if(ll[y[a].second]){ //printf("ll %d %d %d\n",y[a].second,qa,ib); ia++; //query while(!z.empty()){ if(-z.top()>y[a].second)break; f2(ra[-z.top()],rb[-z.top()],19,0,1); z.pop(); } while(!zz.empty()){ if(-zz.top()>y[a].second)break; qa++; zz.pop(); } // printf("ll %d %d %d\n",y[a].second,qa,ib); if(qa<ib){ re= f1(qa,ib,19,0); //if(re.first!=0){ pt=make_pair(min(rbx[re.second],y[a].second),max(rbx[re.second],y[a].second)); // printf("ans %d %d %d\n",re.first,pt.first,pt.second); if(re.first<ansv)ans=pt,ansv=re.first; else if(re.first==ansv)ans=min(ans,pt); //} } //delete /* if(ia!=ltx.size())while(dx!=ltx[ia]){ if(!ll[dx]&&!rr[dx])if(ra[dx]<rb[dx])f2(ra[dx],rb[dx],19,0,1); if(rr[dx])qa++; dx++; } if(ia!=ltx.size()){ while(!z.empty()){ if(-z.top()<ltx[ia]){ f2(ra[-z.top()],rb[-z.top()],19,0,1); z.pop(); }else break; } while(qa!=rbx.size()&&rbx[qa]<ltx[ia])qa++; } */ } if(rr[y[a].second]){ //printf("rr %d\n",a); zz.push(-y[a].second); ib++; //nth } if(!ll[y[a].second]&&!rr[y[a].second]){ if(ra[y[a].second]<rb[y[a].second]){ f2(ra[y[a].second],rb[y[a].second],19,0,-1); z.push(-y[a].second); } //printf(""); } } printf("%d %d\n",ans.first,ans.second); //system("pause"); return 0; }