#include<bits/stdc++.h>
using namespace std;
long long a[150007];
long long ans[150007];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
int flag=0;
for(int i=2;i<=n;i++){
if(a[i]!=a[i-1]){//全部一样且并不全为0则无答案
flag=1;
break;
}
}
int cnt=0;
for(int i=1;i<=n;i++){
if(a[i]==0)
cnt++;
}
if(cnt==n){
printf("YES
");
for(int i=1;i<=n;i++)
printf("1 ");//都是零让答案一样即可,此处选择全部输出1
return 0;
}
if(!flag)
printf("NO");
else{
printf("YES
");
long long mx=0;
for(int i=1;i<=n;i++){
if(a[i]>mx)
mx=a[i];
}
//printf("%d
",mx);
if(a[1]==mx&&a[1]>a[n])
flag=1;
for(int i=2;i<=n;i++){
if(a[i]==mx&&a[i]>a[i-1])
flag=i;//找到最后一个最大值并且a[i]>a[i-1]开始递推
}
if(flag==n){
ans[flag]=a[flag];
ans[flag-1]=ans[flag]*2+a[flag-1];//不*2的情况给出一组反例例如3 0 1 0 则output1 1 1 *2后output2 1 2就避免了最大值对后面的值%时出现<=的情况
for(int i=flag-2;i>=1;i--){
ans[i]=ans[i+1]+a[i];//根据观察构造的函数
}
for(int i=1;i<=n;i++)
printf("%lld ",ans[i]);
}
else if(flag!=1){//类似上一个if
ans[flag]=a[flag];
ans[flag-1]=ans[flag]*2+a[flag-1];
for(int i=flag-2;i>=1;i--){
ans[i]=ans[i+1]+a[i];
}
ans[n]=ans[1]+a[n];
for(int i=n-1;i>flag;i--){
ans[i]=ans[i+1]+a[i];
}
for(int i=1;i<=n;i++)
printf("%lld ",ans[i]);
}
else if(flag==1){//类似上一个if
ans[flag]=a[flag];
ans[n]=ans[1]*2+a[n];
for(int i=n-1;i>=2;i--){
ans[i]=ans[i+1]+a[i];
}
for(int i=1;i<=n;i++)
printf("%lld ",ans[i]);
}
}
return 0;
}