比赛 |
20150421 |
评测结果 |
AAWAAEEE |
题目名称 |
山海经 |
最终得分 |
50 |
用户昵称 |
new ioer |
运行时间 |
0.901 s |
代码语言 |
C++ |
内存使用 |
3.77 MiB |
提交时间 |
2015-04-21 08:58:01 |
显示代码纯文本
#include<cstdio>
struct node{
node *c[2];
int l,r,le,re,ml,mr,sum,lmax,rmax,mmax;
void print(){
printf("%d %d %d\n",ml,mr,mmax);
}
node(int L,int R){
l=L,r=R,c[0]=c[1]=NULL;
le=re=ml=mr=sum=lmax=rmax=mmax=0;
}
void update(){
sum=c[0]->sum+c[1]->sum;
le=c[0]->le,lmax=c[0]->lmax;
re=c[1]->re,rmax=c[1]->rmax;
ml=c[0]->ml,mr=c[0]->mr,mmax=c[0]->mmax;
if(c[0]->sum+c[1]->lmax> lmax) lmax=c[0]->sum+c[1]->lmax,le=c[1]->le;
if(c[1]->sum+c[0]->rmax>=rmax) rmax=c[1]->sum+c[0]->rmax,re=c[0]->re;
if(c[0]->rmax+c[1]->lmax>mmax) ml=c[0]->re,mr=c[1]->le,mmax=c[0]->rmax+c[1]->lmax;
if(c[1]->mmax>mmax) ml=c[1]->ml,mr=c[1]->mr,mmax=c[1]->mmax;
}
};
int s,t,a[100001];
void build(node *&o,int l,int r){
o=new node(l,r);
if(l==r){
o->le=o->re=o->ml=o->mr=r;
o->sum=o->lmax=o->rmax=o->mmax=a[r];
return;
}
int mid=(l+r)>>1;
build(o->c[0],l,mid),build(o->c[1],mid+1,r);
o->update();
}
node *query(node *o){
if(s<=o->l&&o->r<=t) return o;
int mid=(o->l+o->r)>>1;
if(mid>=t) return query(o->c[0]);
else if(mid<s) return query(o->c[1]);
else{
node *res=new node(s,t);
res->c[0]=query(o->c[0]),res->c[1]=query(o->c[1]);
res->l=res->c[0]->l,res->r=res->c[1]->r,res->update();
return res;
}
}
int main(){
freopen("hill.in","r",stdin);
freopen("hill.out","w",stdout);
node *root;
int n,m,i;
for(scanf("%d%d",&n,&m),i=1;i<=n;i++) scanf("%d",&a[i]);
build(root,1,n);
while(m--) scanf("%d%d",&s,&t),query(root)->print();
}