树状数组维护二三次方和,线段树维护区间 min max,__int128 自然溢出。
#include<cstdio>
#include<algorithm>
#include<set>
#include<cmath>
using namespace std;
typedef __int128 ll;
namespace FASTIO{
inline ll read(){
register ll x=0,f=1;
static char ch=getchar();
while(ch>'9'||ch<'0'){
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<3)+(x<<1)+(ch^48);
ch=getchar();
}
return x*f;
}
inline void write(ll x){
if(x<0)putchar('-'),x=-x;
register int i=0;
static char s[30];
while(x||i==0)s[i++]=x%10+'0',x/=10;
while(i--)putchar(s[i]);
putchar('\n');
}
}
using namespace FASTIO;
const int N=5e5+1;
ll n,m,a[N],tsq[N],tcb[N],mx[4*N],mn[4*N];
inline void addsq(ll x,ll y){
while(x<=n){
tsq[x]+=y*y;
x+=x&(-x);
}
}
inline void addcb(ll x,ll y){
while(x<=n){
tcb[x]+=y*y*y;
x+=x&(-x);
}
}
inline void mnssq(ll x,ll y){
while(x<=n){
tsq[x]-=y*y;
x+=x&(-x);
}
}
inline ll qrysq(ll x){
ll ret=0;
while(x){
ret+=tsq[x];
x-=x&(-x);
}
return ret;
}
inline ll qrycb(ll x){
ll ret=0;
while(x){
ret+=tcb[x];
x-=x&(-x);
}
return ret;
}
inline int ls(ll x){return x<<1;}
inline int rs(ll x){return x<<1|1;}
inline void pushup(ll x){
mx[x]=mx[ls(x)]>mx[rs(x)]?mx[ls(x)]:mx[rs(x)];
mn[x]=mn[ls(x)]<mn[rs(x)]?mn[ls(x)]:mn[rs(n)];
}
inline void pushdown(ll x,ll val){
mx[x]=val;
mn[x]=val;
}
void build(ll x,ll l,ll r){
if(l==r){
pushdown(x,a[l]);
return;
}
int mid=(l+r)>>1;
build(ls(x),l,mid);
build(rs(x),mid+1,r);
pushup(x);
}
void update(ll x,ll l,ll r,ll X,ll k){
if(l==r){
pushdown(x,k);
return;
}
int mid=(l+r)>>1;
if(X<=mid)update(ls(x),l,mid,X,k);
else update(rs(x),mid+1,r,X,k);
pushup(x);
}
ll querymax(ll L,ll R,ll l,ll r,ll x){
ll ans=-2e9;
if(L<=l&&R>=r)return mx[x];
int mid=(l+r)>>1;
if(L<=mid)ans=max(ans,querymax(L,R,l,mid,ls(x)));
if(R>mid)ans=max(ans,querymax(L,R,mid+1,r,rs(x)));
return ans;
}
ll querymin(ll L,ll R,ll l,ll r,ll x){
ll ans=2e9;
if(L<=l&&R>=r)return mn[x];
int mid=(l+r)>>1;
if(L<=mid)ans=min(ans,querymin(L,R,l,mid,ls(x)));
if(R>mid)ans=min(ans,querymin(L,R,mid+1,r,rs(x)));
return ans;
}
int main(){
n=read(),m=read();
for(int i=1;i<=n;i++){
a[i]=read();
addsq(i,a[i]);
addcb(i,a[i]);
}
build(1,1,n);
while(m--){
ll op,x,y;
op=read(),x=read(),y=read();
if(op==1){
mnssq(x,a[x]);
addcb(x,-a[x]);
update(1,1,n,x,y);
a[x]=y;
addsq(x,a[x]);
addcb(x,a[x]);
}
else{
ll tmpmx=querymax(x,y,1,n,1),tmpmn=querymin(x,y,1,n,1),tmpsq=qrysq(y)-qrysq(x-1),tmpcb=qrycb(y)-qrycb(x-1);
ll rsq,rsm1,rsm2,rcb;
rsq=tmpmx*(tmpmx+1)*(2*tmpmx+1)-tmpmn*(tmpmn-1)*(2*tmpmn-1);
rsm1=(1+tmpmx)*tmpmx/2;
rsm2=(tmpmn-1)*tmpmn/2;
rcb=rsm1*rsm1-rsm2*rsm2;
if(tmpsq*6==rsq&&tmpcb==rcb)printf("damushen\n");
else printf("yuanxing\n");
}
}
return 0;
}