#include #define vi vector #define INF INT_MAX using namespace std; int gcd(int a,int b){ if(!b) return a; return gcd(b,a%b); } struct sol{int g,s,m,ans; sol(int a=0,int b=0,int c=0,int d=0):g(a),s(b),m(c),ans(d){ } }; class SegmentTree{ vector st; int n; // No. of elements in the original array void make_segment_tree(const vector& v,int pos,int low,int high,int& anss) { if(low==high){ st[pos]=sol(v[low],v[low],v[low],0); return; } else{ int mid=(low+high)/2; make_segment_tree(v,2*pos+1,low,mid,anss); make_segment_tree(v,2*pos+2,mid+1,high,anss); //st[pos]=min(st[2*pos+1],st[2*pos+2]); int q=2*pos+1,w=2*pos+2; st[pos].g=gcd(st[q].g,st[w].g),st[pos].m=max(st[q].m,st[w].m); st[pos].s=st[q].s+st[w].s,st[pos].ans=max(st[q].ans,st[w].ans); anss=max(anss,st[pos].g*(st[pos].s-st[pos].m)); } } /*void RMQ(int qlow,int qhigh,int pos,int low,int high,int & anss) { if(qlow<=low&&qhigh>=high){ anss=max(anss,st[pos].g*(st[pos].s-st.pos[m])) //Total Overlap return st[pos];} else if(qlow>high||qhigh>n; vi v(n); for(int& i : v)cin>>i; SegmentTree st(v); cout<