gss1
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct st{int s,ls,rs,ms;}t[400050]; 4 int n,m,a[100050]; 5 st merge(st l,st r){return (st){l.s+r.s,max(l.ls,l.s+r.ls),max(l.rs+r.s,r.rs),max(max(l.ms,r.ms),l.rs+r.ls)};} 6 void build(int x,int l,int r) 7 { 8 if(l==r){t[x].s=t[x].ls=t[x].rs=t[x].ms=a[l];return;} 9 int md=(l+r)>>1; 10 build(x<<1,l,md);build(x<<1|1,md+1,r); 11 t[x]=merge(t[x<<1],t[x<<1|1]); 12 } 13 st qry(int x,int l,int r,int ll,int rr) 14 { 15 if(ll<=l&&r<=rr)return t[x]; 16 int md=(l+r)>>1; 17 st lst,rst; 18 if(ll<=md)lst=qry(x<<1,l,md,ll,rr); 19 if(rr>md)rst=qry(x<<1|1,md+1,r,ll,rr); 20 return rr<=md?lst:(ll>md?rst:merge(lst,rst)); 21 } 22 int main() 23 { 24 scanf("%d",&n); 25 for(int i=1;i<=n;i++)scanf("%d",&a[i]); 26 build(1,1,n); 27 scanf("%d",&m); 28 while(m--) 29 { 30 int l,r;scanf("%d%d",&l,&r); 31 printf("%d\n",qry(1,1,n,l,r).ms); 32 } 33 return 0; 34 }
gss3
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct st{int s,ls,rs,ms;}t[400050]; 4 int n,m,a[100050]; 5 st merge(st l,st r){return (st){l.s+r.s,max(l.ls,l.s+r.ls),max(l.rs+r.s,r.rs),max(max(l.ms,r.ms),l.rs+r.ls)};} 6 void build(int x,int l,int r) 7 { 8 if(l==r){t[x].s=t[x].ls=t[x].rs=t[x].ms=a[l];return;} 9 int md=(l+r)>>1; 10 build(x<<1,l,md);build(x<<1|1,md+1,r); 11 t[x]=merge(t[x<<1],t[x<<1|1]); 12 } 13 st qry(int x,int l,int r,int ll,int rr) 14 { 15 if(ll<=l&&r<=rr)return t[x]; 16 int md=(l+r)>>1; 17 st lst,rst; 18 if(ll<=md)lst=qry(x<<1,l,md,ll,rr); 19 if(rr>md)rst=qry(x<<1|1,md+1,r,ll,rr); 20 return rr<=md?lst:(ll>md?rst:merge(lst,rst)); 21 } 22 void chg(int x,int l,int r,int p,int v) 23 { 24 if(l==r){t[x].s=t[x].ls=t[x].rs=t[x].ms=v;return;} 25 int md=(l+r)>>1; 26 if(p<=md)chg(x<<1,l,md,p,v);else chg(x<<1|1,md+1,r,p,v); 27 t[x]=merge(t[x<<1],t[x<<1|1]); 28 } 29 int main() 30 { 31 scanf("%d",&n); 32 for(int i=1;i<=n;i++)scanf("%d",&a[i]); 33 build(1,1,n); 34 scanf("%d",&m); 35 while(m--) 36 { 37 int kd,x,y;scanf("%d%d%d",&kd,&x,&y); 38 if(kd)printf("%d\n",qry(1,1,n,x,y).ms);else chg(1,1,n,x,y); 39 } 40 return 0; 41 }
gss4
1 #include<bits/stdc++.h> 2 using namespace std; 3 long long a[100010],bit[100010]; 4 int tt,n,m,fa[100010]; 5 int fnd(int x){if(!fa[x]||fa[x]==x)return fa[x]=x;return fa[x]=fnd(fa[x]);} 6 void add(int x,long long v){while(x<=n){bit[x]+=v;x+=x&(-x);}} 7 long long sum(int x) 8 { 9 long long ans=0; 10 while(x){ans+=bit[x];x-=x&(-x);} 11 return ans; 12 } 13 int main() 14 { 15 while(scanf("%d",&n)==1) 16 { 17 memset(bit,0,sizeof(bit)); 18 memset(fa,0,sizeof(fa)); 19 printf("Case #%d:\n",++tt); 20 for(int i=1;i<=n;i++) 21 { 22 scanf("%lld",&a[i]); 23 add(i,a[i]); 24 if(a[i]<=1)fa[i]=i+1; 25 } 26 scanf("%d",&m); 27 for(int i=1;i<=m;i++) 28 { 29 int kd,l,r; 30 scanf("%d%d%d",&kd,&l,&r); 31 if(l>r)swap(l,r); 32 if(kd==1)printf("%lld\n",sum(r)-sum(l-1)); 33 else 34 { 35 for(int j=l;j<=r;j=fnd(j+1)) 36 { 37 add(j,(long long)sqrt(a[j])-a[j]); 38 a[j]=(long long)sqrt(a[j]); 39 if(a[j]<=1)fa[j]=fnd(j+1); 40 } 41 } 42 } 43 puts(""); 44 } 45 return 0; 46 }
gss5
1 #include<bits/stdc++.h> 2 using namespace std; 3 struct st{int s,ls,rs,ms;}t[400050]; 4 int n,m,a[100050],s[100050]; 5 st merge(st l,st r){return (st){l.s+r.s,max(l.ls,l.s+r.ls),max(l.rs+r.s,r.rs),max(max(l.ms,r.ms),l.rs+r.ls)};} 6 void build(int x,int l,int r) 7 { 8 if(l==r){t[x].s=t[x].ls=t[x].rs=t[x].ms=a[l];return;} 9 int md=(l+r)>>1; 10 build(x<<1,l,md);build(x<<1|1,md+1,r); 11 t[x]=merge(t[x<<1],t[x<<1|1]); 12 } 13 st qry(int x,int l,int r,int ll,int rr) 14 { 15 if(ll<=l&&r<=rr)return t[x]; 16 int md=(l+r)>>1; 17 st lst,rst; 18 if(ll<=md)lst=qry(x<<1,l,md,ll,rr); 19 if(rr>md)rst=qry(x<<1|1,md+1,r,ll,rr); 20 return rr<=md?lst:(ll>md?rst:merge(lst,rst)); 21 } 22 int main() 23 { 24 int tt;scanf("%d",&tt); 25 while(tt--) 26 { 27 scanf("%d",&n); 28 for(int i=1;i<=n;i++)scanf("%d",&a[i]),s[i]=s[i-1]+a[i]; 29 build(1,1,n); 30 scanf("%d",&m); 31 while(m--) 32 { 33 int x1,y1,x2,y2,ans;scanf("%d%d%d%d",&x1,&y1,&x2,&y2); 34 if(y1<x2)ans=qry(1,1,n,x1,y1).rs+qry(1,1,n,x2,y2).ls+s[x2-1]-s[y1]; 35 else 36 { 37 ans=-1e9-7; 38 int l=0,m=0,mr=0,r=0; 39 if(x2>x1) 40 { 41 st q=qry(1,1,n,x1,x2-1); 42 l=max(l,q.rs); 43 } 44 st q=qry(1,1,n,x2,y1); 45 ans=max(l+q.ls,q.ms); 46 mr=q.rs;m=q.s; 47 if(y1<y2) 48 { 49 st q=qry(1,1,n,y1+1,y2); 50 r=max(r,q.ls); 51 } 52 ans=max(ans,max(l+m+r,mr+r)); 53 } 54 printf("%d\n",ans); 55 } 56 } 57 return 0; 58 }