记录编号 433279 评测结果 AAAAAAAA
题目名称 山海经 最终得分 100
用户昵称 GravatarHzoi_moyi 是否通过 通过
代码语言 C++ 运行时间 0.744 s
提交时间 2017-08-05 09:37:38 内存使用 15.96 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int sj=100010;
int n,m,li[sj],ans,zb,yb,zi,yi,zj,yj,vi;
struct node
{
     int l,r,v;
     int al,ar,a;
     int zj,yj,zm,ym;
}t[sj*4];
void build(int x,int l,int r)
{
     t[x].l=l,t[x].r=r;
     if(l==r)
     {
        t[x].v=t[x].a=t[x].zm=t[x].ym=li[l];
        t[x].al=t[x].ar=t[x].zj=t[x].yj=l;
        return;
     }
     int mid=(l+r)>>1,ls=x<<1,rs=(x<<1)|1;
     build(ls,l,mid),build(rs,mid+1,r);
     t[x].v=t[ls].v+t[rs].v;
     int temp=t[ls].ym+t[rs].zm;
     if(t[ls].a>=t[x].a)
        t[x].a=t[ls].a,t[x].al=t[ls].al,t[x].ar=t[ls].ar;
     if(temp>t[x].a)
         t[x].a=temp,t[x].al=t[ls].yj,t[x].ar=t[rs].zj;
     if(t[rs].a>t[x].a)   
        t[x].a=t[rs].a,t[x].al=t[rs].al,t[x].ar=t[rs].ar;
     t[x].zm=t[ls].zm,t[x].zj=t[ls].zj;
     t[x].ym=t[rs].ym,t[x].yj=t[rs].yj;
     if(t[ls].ym+t[rs].v>t[x].ym)
          t[x].ym=t[ls].ym+t[rs].v,t[x].yj=t[ls].yj;
     if(t[rs].zm+t[ls].v>=t[x].zm)
          t[x].zm=t[rs].zm+t[ls].v,t[x].zj=t[rs].zj;
}
int query(int x,int y,int z)
{
    if(y<=t[x].l&&z>=t[x].r)
    {
        zb=t[x].al,yb=t[x].ar;
        zi=t[x].zm,yi=t[x].ym;
        zj=t[x].zj,yj=t[x].yj;
        vi=t[x].v;
        return t[x].a;
    }
    int mid=(t[x].l+t[x].r)>>1;
    if(z<=mid) return query(x<<1,y,z);
    if(y>mid)  return query((x<<1)|1,y,z);
    int ans1=query(x<<1,y,z);
    int jlz1=zi,jly1=yi,ljz1=zj,ljy1=yj,l11=zb,l12=yb,zv1=vi;
    int ans2=query((x<<1)|1,y,z);
    int jlz2=zi,jly2=yi,ljz2=zj,ljy2=yj,l21=zb,l22=yb,zv2=vi;
    int ansz=jly1+jlz2;
    zi=jlz1,zj=ljz1,yi=jly2,yj=ljy2;
    if(jlz2+zv1>zi)  zi=jlz2+zv1,zj=ljz2;
    if(jly1+zv2>=yi)  yi=jly1+zv2,yj=ljy1;
    if(ans1>=ans2&&ans1>=ansz)
    {
        zb=l11,yb=l12;
        return ans1;
    }
    if(ansz>=ans2)
    {
        zb=ljy1,yb=ljz2;
        return ansz;
    }
    zb=l21,yb=l22;
    return ans2;
}
int main()
{
    //freopen("t.txt","r",stdin);
    freopen("hill.in","r",stdin);
    freopen("hill.out","w",stdout);
    memset(t,-0x7f,sizeof(t));
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++) scanf("%d",&li[i]);
    build(1,1,n);
    int a1,a2;
    for(int i=1;i<=m;i++)
    {
       scanf("%d%d",&a1,&a2);
       ans=query(1,a1,a2);
       while(li[yb]==0) yb--;
       printf("%d %d %d\n",zb,yb,ans);
    }
    //while(1);
    return 0;
}