比赛 |
20150421 |
评测结果 |
AAAAAAAA |
题目名称 |
山海经 |
最终得分 |
100 |
用户昵称 |
真呆菌 |
运行时间 |
1.278 s |
代码语言 |
C++ |
内存使用 |
31.73 MiB |
提交时间 |
2015-04-21 09:08:54 |
显示代码纯文本
#include<cstdio>
using namespace std;
const int N = 201000;
const int M = 101000;
using namespace std;
int Max(int x,int y){if(x>y) return x;return y;}
struct SegTree{int lx,rx,sx,sum,lln,rrn,ln,rn,l,r;}T[N<<2],res;
int n,m,seq[N],L,R;
bool Cmp(int a,int b,int la,int lb,int ra,int rb){
if(a<b) return 1;
if(a==b&&la>lb) return 1;
if(a==b&&la==lb&&ra>rb) return 1;
return 0;
}
SegTree operator + (const SegTree &a,const SegTree &b){
SegTree t;
t.l=a.l;t.r=b.r;
t.sum=a.sum+b.sum;t.sx=t.sum;
t.lx=a.lx;t.lln=a.lln;t.ln=t.l;
t.rx=b.rx;t.rrn=b.rrn;t.rn=t.r;
if(Cmp(t.lx,a.sum+b.lx,t.l,t.l,t.lln,b.lln)) t.lx=a.sum+b.lx,t.lln=b.lln;
if(Cmp(t.rx,b.sum+a.rx,t.rrn,a.rrn,t.r,t.r)) t.rx=b.sum+a.rx,t.rrn=a.rrn;
if(Cmp(t.sx,a.sx,t.ln,a.ln,t.rn,a.rn)) t.sx=a.sx,t.ln=a.ln,t.rn=a.rn;
if(Cmp(t.sx,b.sx,t.ln,b.ln,t.rn,b.rn)) t.sx=b.sx,t.ln=b.ln,t.rn=b.rn;
if(Cmp(t.sx,t.lx,t.ln,t.l,t.rn,t.lln)) t.sx=t.lx,t.ln=t.l,t.rn=t.lln;
if(Cmp(t.sx,t.rx,t.ln,t.rrn,t.rn,t.r)) t.sx=t.rx,t.ln=t.rrn,t.rn=t.r;
if(Cmp(t.sx,a.rx+b.lx,t.ln,a.rrn,t.rn,b.lln)) t.sx=a.rx+b.lx,t.ln=a.rrn,t.rn=b.lln;
return t;
}
void Build(int a,int l,int r){
if(l==r){T[a]=(SegTree){seq[l],seq[l],seq[l],seq[l],l,r,l,r,l,r};return;}
int mid=(l+r)>>1;
Build(a<<1,l,mid);
Build(a<<1|1,mid+1,r);
T[a]=T[a<<1]+T[a<<1|1];
return;
}
SegTree Query(int a){
if(T[a].l>=L&&T[a].r<=R) return T[a];
int mid=(T[a].l+T[a].r)>>1;
if(R<=mid) return Query(a<<1);
if(L>mid) return Query(a<<1|1);
else return Query(a<<1)+Query(a<<1|1);
}
int main(){
#define READ
#ifdef READ
freopen("hill.in","r",stdin);
freopen("hill.out","w",stdout);
#endif
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d",&seq[i]);
Build(1,1,n);
for(int i=1;i<=m;i++){
scanf("%d%d",&L,&R);
res=Query(1);
printf("%d %d %d\n",res.ln,res.rn,res.sx);
}
return 0;
}