# Bzoj4850 [jsoi2016]灯塔

## 乱搞强势水过

Posted by yjjr's blog on February 18, 2018

# 题目

## Description

JSOI的国境线上有N一座连续的山峰,其中第i座的高度是hi.

JSOI国王希望对于每一座山峰,JYY都能提供建造一座能够照亮全部其他山峰的灯塔所需要的最小高度.你能帮助JYY么?

1< N ≤ 10^5

0 < hi ≤ 10^9

## Sample Input

6
5
3
2
4
2
4


## Sample Output

2
3
5
3
5
4


# code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<algorithm>
#define rep(i,a,b) for(register int i=a;i<=b;i++)
#define dep(i,a,b) for(register int i=a;i>=b;i--)
#define ll long long
#define mem(x,num) memset(x,num,sizeof x)
#define reg(x) for(int i=last[x];i;i=e[i].next)
using namespace std;
ll f=1,x=0;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
const int maxn=1e5+6;
int n,h[maxn],f[maxn][36],bit[maxn],blo;
void RMQ(){
rep(i,1,n)f[i][0]=h[i];
rep(j,1,blo)
rep(i,1,n)
if(i+(1<<j)<=n)f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
inline int query(int l,int r){
int Len=bit[r-l+1];
return max(f[l][Len],f[r-(1<<Len)+1][Len]);
}
void doit(int x){
int i=1,j=x-1,ans=0;
while(true){
int len=i*i-(i-1)*(i-1),k=max(j-len+1,1);
if(k>j)break;int Max=query(k,j);
ans=max(ans,Max-h[x]+i);
if(k==1)break;
j=k-1;i++;
}
i=1,j=x+1;
while(true){
int len=i*i-(i-1)*(i-1),k=min(n,j+len-1);
if(k<j)break;int Max=query(j,k);
ans=max(ans,Max-h[x]+i);
if(k==n)break;
j=k+1;i++;
}
printf("%d\n",ans);
}

int main()
{