记录编号 |
378984 |
评测结果 |
AAAAAAAA |
题目名称 |
山海经 |
最终得分 |
100 |
用户昵称 |
Go灬Fire |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
0.969 s |
提交时间 |
2017-03-05 16:07:19 |
内存使用 |
32.35 MiB |
显示代码纯文本
#include <cmath>
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
#define LL long long
#define Inf 2e9
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
const int maxn=150000;
struct Node{
LL ml,mr,Max,sum;
int l,r,ll,rr;
int L,R;
//Node(){};
Node(LL x=-Inf){l=r=Inf;ml=mr=Max=sum=x;}
}a[maxn<<2];
int n,T;
void pushup(int rt,int l,int r){
a[rt].sum=a[rt<<1].sum+a[rt<<1|1].sum;
a[rt].L=a[rt<<1].L;a[rt].R=a[rt<<1|1].R;
a[rt].ml=a[rt<<1].ml;a[rt].ll=a[rt<<1].ll;
if(a[rt<<1].ml==a[rt<<1].sum){
if(a[rt].ml<a[rt<<1].ml+a[rt<<1|1].ml){
a[rt].ml=a[rt<<1].ml+a[rt<<1|1].ml;
a[rt].ll=a[rt<<1|1].ll;
}
}
if(a[rt<<1].sum+a[rt<<1|1].ml>a[rt].ml){//
a[rt].ml=a[rt<<1].sum+a[rt<<1|1].ml;
a[rt].ll=a[rt<<1|1].ll;
}
a[rt].mr=a[rt<<1|1].mr;a[rt].rr=a[rt<<1|1].rr;
if(a[rt<<1|1].mr==a[rt<<1|1].sum){
if(a[rt].mr<=a[rt<<1|1].mr+a[rt<<1].mr){
a[rt].mr=a[rt<<1|1].mr+a[rt<<1].mr;
a[rt].rr=a[rt<<1].rr;
}
}
if(a[rt<<1|1].sum+a[rt<<1].mr>a[rt].mr){//
a[rt].mr=a[rt<<1|1].sum+a[rt<<1].mr;
a[rt].rr=a[rt<<1].rr;
}
if(a[rt<<1].Max>=a[rt<<1|1].Max){
a[rt].Max=a[rt<<1].Max;
a[rt].l=a[rt<<1].l;a[rt].r=a[rt<<1].r;
}else {
a[rt].Max=a[rt<<1|1].Max;
a[rt].l=a[rt<<1|1].l;a[rt].r=a[rt<<1|1].r;
}
if(a[rt].ml>=a[rt].Max){
a[rt].Max=a[rt].ml;
a[rt].l=l;a[rt].r=a[rt].ll;
}
if(a[rt].mr>a[rt].Max || (a[rt].mr==a[rt].Max && a[rt].l>a[rt].rr)){
a[rt].Max=a[rt].mr;
a[rt].l=a[rt].rr;a[rt].r=r;
}
int tot=a[rt<<1].mr+a[rt<<1|1].ml;
if(a[rt].Max<tot || (a[rt].Max==tot && a[rt].l>a[rt<<1].rr) || (a[rt].Max==tot && a[rt].l==a[rt<<1].rr && a[rt].r>a[rt<<1|1].ll)){
a[rt].Max=tot;
a[rt].l=a[rt<<1].rr;
a[rt].r=a[rt<<1|1].ll;
}
}
void Build(int rt,int l,int r){
if(l==r){
LL x;scanf("%lld",&x);
//printf("%d ",x);
a[rt]=Node(x);a[rt].l=a[rt].r=a[rt].ll=a[rt].rr=l;
a[rt].L=l;a[rt].R=r;
return;
}
int mid=(l+r)>>1;
Build(lson);Build(rson);
pushup(rt,l,r);
}
void Print(int rt,int l,int r){
printf("l=%d r=%d ll=%d rr=%d l=%d r=%d ml=%d mr=%d max=%d sum=%d\n",l,r,a[rt].ll,a[rt].rr,a[rt].l,a[rt].r,a[rt].ml,a[rt].mr,a[rt].Max,a[rt].sum);
if(l==r)return;
int mid=(l+r)>>1;
Print(lson);Print(rson);
}
Node Query(int s,int t,int rt,int l,int r){
if(s<=l && t>=r){
//printf("return::");
//printf("l=%d r=%d ll=%d rr=%d l=%d r=%d ml=%d mr=%d max=%d sum=%d\n",l,r,a[rt].ll,a[rt].rr,a[rt].l,a[rt].r,a[rt].ml,a[rt].mr,a[rt].Max,a[rt].sum);
return a[rt];
}
int mid=(l+r)>>1;
if(t<=mid){
Node ans=Query(s,t,lson);//printf("left:");
//printf("l=%d r=%d ll=%d rr=%d l=%d r=%d ml=%d mr=%d max=%d sum=%d\n",l,r,ans.ll,ans.rr,ans.l,ans.r,ans.ml,ans.mr,ans.Max,ans.sum);
return ans;
}
if(s>mid){
Node ans=Query(s,t,rson);//printf("right:");
//printf("l=%d r=%d ll=%d rr=%d l=%d r=%d ml=%d mr=%d max=%d sum=%d\n",l,r,ans.ll,ans.rr,ans.l,ans.r,ans.ml,ans.mr,ans.Max,ans.sum);
return ans;
}
Node lc=Query(s,t,lson),rc=Query(s,t,rson);
Node ans;
ans.sum=lc.sum+rc.sum;
ans.L=lc.L;ans.R=rc.R;
ans.ml=lc.ml;ans.ll=lc.ll;
if(lc.ml==lc.sum){
if(ans.ml<lc.ml+rc.ml){
ans.ml=lc.ml+rc.ml;
ans.ll=rc.ll;
}
//ans.ml=max(ans.ml,lc.ml+rc.ml);
}
if(lc.sum+rc.ml>ans.ml){//
ans.ml=lc.sum+rc.ml;
ans.ll=rc.ll;
}
ans.mr=rc.mr;ans.rr=rc.rr;
if(rc.mr==rc.sum){
if(ans.mr<=rc.mr+lc.mr){
ans.mr=rc.mr+lc.mr;
ans.rr=lc.rr;
}
//ans.mr=max(ans.mr,rc.mr+lc.mr);
}
if(rc.sum+lc.mr>ans.mr){//
ans.mr=rc.sum+lc.mr;
ans.rr=lc.rr;
}
if(lc.Max>=rc.Max){
ans.Max=lc.Max;
ans.l=lc.l;ans.r=lc.r;
}else {
ans.Max=rc.Max;
ans.l=rc.l;ans.r=rc.r;
}//puts("");
//ans.Max=max(lc.Max,rc.Max);
if(ans.ml>=ans.Max){
ans.Max=ans.ml;
ans.l=ans.L;ans.r=ans.ll;
}//printf("ans::l=%d r=%d L=%d ll=%d rr=%d l=%d r=%d ml=%d mr=%d max=%d sum=%d\n",l,r,ans.L,ans.ll,ans.rr,ans.l,ans.r,ans.ml,ans.mr,ans.Max,ans.sum);
if(ans.mr>ans.Max || (ans.mr==ans.Max && ans.l>ans.rr)){
ans.Max=ans.mr;
ans.l=ans.rr;ans.r=ans.R;
}
//ans.Max=max(ans.ml,ans.Max);
//ans.Max=max(ans.mr,ans.Max);
int tot=lc.mr+rc.ml;
if(ans.Max<tot || (ans.Max==tot && ans.l>lc.rr) || (ans.Max==tot && ans.l==lc.rr && ans.r>rc.ll)){
ans.Max=tot;
ans.l=lc.rr;
ans.r=rc.ll;
}
//printf("merge:\n");
//printf("lc::l=%d r=%d ll=%d rr=%d l=%d r=%d ml=%d mr=%d max=%d sum=%d\n",l,r,lc.ll,lc.rr,lc.l,lc.r,lc.ml,lc.mr,lc.Max,lc.sum);
//printf("rt::l=%d r=%d ll=%d rr=%d l=%d r=%d ml=%d mr=%d max=%d sum=%d\n",l,r,rc.ll,rc.rr,rc.l,rc.r,rc.ml,rc.mr,rc.Max,rc.sum);
//printf("ans::l=%d r=%d ll=%d rr=%d l=%d r=%d ml=%d mr=%d max=%d sum=%d\n",l,r,ans.ll,ans.rr,ans.l,ans.r,ans.ml,ans.mr,ans.Max,ans.sum);
//puts("\n");
return ans;
//ans.Max=max(lc.mr+rc.ml,ans.Max);
/*ans.sum=lc.sum+rc.sum;
ans.ml=lc.ml;
if(lc.ml==lc.sum)ans.ml=max(ans.ml,lc.ml+rc.ml);
ans.mr=rc.mr;
if(rc.mr==rc.sum)ans.mr=max(ans.mr,rc.mr+lc.mr);
ans.Max=max(lc.Max,rc.Max);
ans.Max=max(ans.ml,ans.Max);
ans.Max=max(ans.mr,ans.Max);
ans.Max=max(lc.mr+rc.ml,ans.Max);
//printf("merge:\n");
//printf("lc:: l=%d r=%d ml=%d mr=%d max=%d sum=%d\n",l,r,lc.ml,lc.mr,lc.Max,lc.sum);
//printf("rc:: l=%d r=%d ml=%d mr=%d max=%d sum=%d\n",l,r,rc.ml,rc.mr,rc.Max,rc.sum);
//printf("l=%d r=%d ml=%d mr=%d max=%d sum=%d\n",l,r,ans.ml,ans.mr,ans.Max,ans.sum);
return ans;*/
}
void Init();
int main(){
freopen("hill.in","r",stdin);freopen("hill.out","w",stdout);
Init();
return 0;
}
void Init(){
scanf("%d%d",&n,&T);
Build(1,1,n);//puts("");
//Print(1,1,n);
//printf("Max=%d %d %d %d\n",a[1].ml,a[1].mr,a[1].Max,a[1].sum);
while(T--){
int s,t;scanf("%d%d",&s,&t);
Node ans=Query(s,t,1,1,n);
printf("%d %d %d\n",ans.l,ans.r,ans.Max);
}
}
/*
1 2
4 6
4 6
1 2
4 6
4 5
1 2
4 6
1 6
4 8
*/
/*
5 1
1 -1 1 -1 2
2 4
*/