WA15,调不出来紫砂了
#include<bits/stdc++.h>
using namespace std;
long long Abs(int x)
{
return x>0?x:-x;
}
const int MAXN=2e6+5;
int n;
long long B;
long long b[MAXN];
long long L,R;
deque<pair<long long,int>>S;
int op;
long long deta=0;
long long Rs[MAXN];
long long D[MAXN];
int Ox[MAXN];
long long Dl[MAXN];
long long Dr[MAXN];
pair<long long,int> Ds[MAXN];
pair<long long,int> Dx[MAXN];
long long Res[MAXN];
int main()
{
// freopen("date.in","r",stdin);
// freopen("date.out","w",stdout);
scanf("%d %lld",&n,&B);
for(int i=3;i<=n;i++)
{
scanf("%lld",&b[i]);
}
L=0;
R=b[3];
S.clear();
op=1;
deta=0;
Ox[2]=1;
D[2]=0;
for(int i=3;i<=n;i++)
{
long long B=(b[i]-deta)*op;
bool found=0;
bool F=0;
if(op==1)
{
while(S.size()&&S.back().first>B)
{
S.pop_back();
}
if(S.size()&&S.back().first==B)
{
found=1;
Dx[i]=S.back();
}
R=min(R,B);
if(B>=L&&B<=R)
{
found=1;
}
}
else
{
while(S.size()&&S.front().first<B)
{
S.pop_front();
}
if(S.size()&&S.front().first==B)
{
found=1;
Dx[i]=S.front();
}
L=max(L,B);
if(B>=L&&B<=R)
{
found=1;
}
}
if((S.size()||(L<=R)))
{
F=1;
}
Dl[i]=L;
Dr[i]=R;
op*=-1;
deta*=-1;
deta+=b[i];
if(S.size())
{
Ds[i]=S.front();
}
else
{
Ds[i]=make_pair(-1,-1);
}
if(found)
{
if(op==1)
{
long long Txl=(0-deta)*op;
long long Txr=(b[i]-deta)*op;
L=min(L,Txl);
R=max(R,Txr);
}
else
{
long long Txr=(0-deta)*op;
long long Txl=(b[i]-deta)*op;
L=min(L,Txl);
R=max(R,Txr);
}
}
if(F)
{
if(op==1)
{
S.push_back(make_pair((b[i]-deta)*op,i));
}
else
{
S.push_front(make_pair((b[i]-deta)*op,i));
}
}
D[i]=deta;
Ox[i]=op;
}
if(L<=R||(S.size()))
{
printf("YES\n");
pair<long long,int>Rx;
if(L<=R)
{
Rx.first=L;
Rx.second=-1;
}
else
{
Rx=S.front();
}
int OO=1;
for(int i=n;i>=2;i--)
{
Rs[i]=((Rx.first*Ox[i])+D[i])*OO;
if(i==2)
{
break;
}
if(Rx.second==-1)
{
long long Rl=Dl[i];
long long Rr=Dr[i];
long long B=(b[i]-D[i-1])*Ox[i-1];
if(Rx.first>=Rl&&Rx.first<=Rr)
{
}
else
{
if(Rl<=B&&B<=Rr)
{
Rx.first=B;
Rx.second=-1;
}
else
{
Rx=Dx[i];
}
OO*=-1;
}
}
else if(Rx.second==i)
{
if(Ds[i].first!=-1)
{
Rx=Ds[i];
}
else
{
Rx.first=Dl[i];
Rx.second=-1;
}
OO*=-1;
}
}
Res[1]=0;
long long Now=0;
for(int i=2;i<=n;i++)
{
Now+=Rs[i];
Res[i]=Now;
}
long long Mini=0;
for(int i=1;i<=n;i++){
Mini=min(Mini,Res[i]);
}
for(int i=1;i<=n;i++)
{
printf("%lld ",Res[i]-Mini);
}
}
else
{
printf("NO\n");
}
}