比赛 |
20120418s |
评测结果 |
AAAAAAEE |
题目名称 |
山海经 |
最终得分 |
75 |
用户昵称 |
kaaala |
运行时间 |
0.000 s |
代码语言 |
C++ |
内存使用 |
0.00 MiB |
提交时间 |
2012-04-18 09:52:30 |
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node
{
int l,r,mxx,ll,lr,rl,rr,sum,lt,rt,lmx,rmx;
}Tree[200020];
int val[100010],N,M;
inline void updata(int p)
{
int pl=2*p,pr=pl+1;
Tree[p].sum=Tree[pl].sum+Tree[pr].sum;
Tree[p].mxx=Tree[pl].mxx;
Tree[p].l=Tree[pl].l;
Tree[p].r=Tree[pl].r;
if(Tree[p].mxx<(Tree[pl].rmx+Tree[pr].lmx))
{
Tree[p].l=Tree[pl].rl;
Tree[p].r=Tree[pr].lr;
Tree[p].mxx =Tree[pl].rmx+Tree[pr].lmx;
}
if(Tree[p].mxx<Tree[pr].mxx)
{
Tree[p].l=Tree[pr].l;
Tree[p].r=Tree[pr].r;
Tree[p].mxx=Tree[pr].mxx;
}
Tree[p].lmx=Tree[pl].sum+Tree[pr].lmx;
Tree[p].ll=Tree[pl].lt;
Tree[p].lr=Tree[pr].lr;
if(Tree[p].lmx<Tree[pl].lmx)
{
Tree[p].ll=Tree[pl].ll;
Tree[p].lr=Tree[pl].lr;
Tree[p].lmx=Tree[pl].lmx;
}
Tree[p].rmx=Tree[pr].sum+Tree[pl].rmx;
Tree[p].rl=Tree[pl].rl;
Tree[p].rr=Tree[pr].rt;
if(Tree[p].rmx<Tree[pr].rmx)
{
Tree[p].rl=Tree[pr].rl;
Tree[p].rr=Tree[pr].rr;
Tree[p].rmx=Tree[pr].rmx;
}
}
void Build(int p,int l,int r)
{
Tree[p].lt=l;
Tree[p].rt=r;
if(l==r)
{
Tree[p].sum=Tree[p].mxx=Tree[p].lmx=Tree[p].rmx=val[l];
Tree[p].l=Tree[p].r=Tree[p].rl=Tree[p].rr=Tree[p].ll=Tree[p].lr=l;
}
else
{
int mid=(l+r)>>1;
Build(2*p,l,mid);
Build(2*p+1,mid+1,r);
updata(p);
}
}
inline Node combine(const Node &n1,const Node &n2)
{
Node n;
n.sum=n1.sum+n2.sum;
n.mxx=n1.mxx;
n.l=n1.l;
n.r=n1.r;
if(n.mxx<(n1.rmx+n2.lmx))
{
n.l=n1.rl;
n.r=n2.lr;
n.mxx=n1.rmx+n2.lmx;
}
if(n.mxx<n2.mxx)
{
n.l=n2.l;
n.r=n2.r;
n.mxx=n2.mxx;
}
n.lmx=n1.sum+n2.lmx;
n.ll=n1.lt;
n.lr=n2.lr;
if(n.lmx<n1.lmx)
{
n.ll=n1.ll;
n.lr=n1.lr;
n.lmx=n1.lmx;
}
n.rmx=n2.sum+n1.rmx;
n.rl=n1.rl;
n.rr=n2.rt;
if(n.rmx<n2.rmx)
{
n.rl=n2.rl;
n.rr=n2.rr;
n.rmx=n2.rmx;
}
return n;
}
Node Find(int p,int l,int r)
{
if(l==Tree[p].lt&&r==Tree[p].rt)
return Tree[p];
else
{
int pl=2*p,pr=2*p+1;
if(l<=Tree[pl].rt&&r>=Tree[pr].lt)
{
Node n1=Find(pl,l,Tree[pl].rt),n2=Find(pr,Tree[pr].lt,r);
return combine(n1,n2);
}
else if(l>=Tree[pr].lt)
return Find(pr,l,r);
else if(r<=Tree[pl].rt)
return Find(pl,l,r);
}
}
int main()
{
freopen("hill.in","r",stdin);
freopen("hill.out","w",stdout);
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++)
scanf("%d",&val[i]);
Build(1,1,N);
for(int i=1;i<=M;i++)
{
int l,r;
scanf("%d%d",&l,&r);
Node ans=Find(1,l,r);
printf("%d %d %d\n",ans.l,ans.r,ans.mxx);
}
return 0;
}