记录编号 |
380519 |
评测结果 |
AAAAAAAA |
题目名称 |
山海经 |
最终得分 |
100 |
用户昵称 |
Ostmbh |
是否通过 |
通过 |
代码语言 |
C++ |
运行时间 |
1.468 s |
提交时间 |
2017-03-09 16:46:16 |
内存使用 |
57.51 MiB |
显示代码纯文本
#include<cstdio>
#include<algorithm>
#define maxn 1000000
#define INF 1<<25
#define u tree[x]
#define lc tree[x<<1]
#define rc tree[x<<1|1]
using namespace std;
struct node{
int l,r,val;
};
node operator + (node x, node y) {
return (node){min(x.l,y.l),max(x.r,y.r),x.val+y.val};
}
class poi{
public:
int l,r;
node lv,rv,max,sum;
poi(){
lv=(node){1,1,-INF};
rv=(node){1,1,-INF};
max=(node){1,1,-INF};
sum=(node){1,1,-INF};
}
}tree[maxn];
int a[maxn];
node max (node a,node b){
if (a.val!=b.val) return a.val<b.val?b:a;
else
if (a.l!=b.l) return a.l<b.l?a:b;
else
return a.r<b.r?a:b;
}
void update(int x){
u.sum=lc.sum+rc.sum;
u.lv=max(rc.lv+lc.sum,lc.lv);
u.rv=max(lc.rv+rc.sum,rc.rv);
u.max=max(u.max,lc.max);
u.max=max(u.max,rc.max);
u.max=max(u.max,lc.rv+rc.lv);
}
void maketree(int x,int l,int r){
u.l=l;u.r=r;
if (l==r){
u.sum=(node){l,r,a[l]};
u.max=(node){l,r,a[l]};
u.lv=(node){l,r,a[l]};
u.rv=(node){l,r,a[l]};
}
else{
maketree(x<<1,l,(l+r>>1));
maketree(x<<1|1,(l+r>>1)+1,r);
update(x);
}
}
poi max(int x,int l,int r){
if (l<=u.l&&u.r<=r){
return u;
}
else{
poi a,b,tmp;
if (l<=lc.r){
a=max(x<<1,l,r);
}
if (r>=rc.l){
b=max(x<<1|1,l,r);
}
tmp.max=max(a.max,b.max);
tmp.max=max(a.rv+b.lv,tmp.max);
tmp.lv=max(a.lv,a.sum+b.lv);
tmp.rv=max(b.rv,b.sum+a.rv);
tmp.sum=a.sum+b.sum;
return tmp;
}
}
int main(){
freopen("hill.in","r",stdin);
freopen("hill.out","w",stdout);
int n,m;
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
maketree(1,1,n);
int l,r;
for(int i=1;i<=m;i++){
scanf("%d %d",&l,&r);
poi ans=max(1,l,r);
printf("%d %d %d\n",ans.max.l,ans.max.r,ans.max.val);
}
return 0;
}