补药让我错啊
#include<bits/stdc++.h>
#define mid (t[id].l+t[id].r>>1)
#define ls id<<1
#define rs id<<1|1
#define int unsigned long long
using namespace std;
const int N=5e5+5;
struct node1{
int l,r,mx,mn,s,sum;
}t[N<<2];
struct node2{
int mx,mn,s,sum;
};
int n,m,a[N];
void build(int l,int r,int id){
t[id].l=l,t[id].r=r;
if(l==r){
t[id].mx=t[id].mn=t[id].sum=a[l];
t[id].s=(int)pow(a[l],3);
return ;
}
build(l,mid,ls);
build(mid+1,r,rs);
t[id].mx=max(t[ls].mx,t[rs].mx);
t[id].mn=min(t[ls].mn,t[rs].mn);
t[id].s=t[ls].s+t[rs].s;
t[id].sum=t[ls].sum+t[rs].sum;
}
void update(int id,int k,int d){
if(t[id].l==k&&t[id].r==k){
t[id].mx=t[id].mn=t[id].sum=d;
t[id].s=(int)pow(d,3);
return ;
}
if(k<=mid)update(ls,k,d);
else update(rs,k,d);
t[id].mx=max(t[ls].mx,t[rs].mx);
t[id].mn=min(t[ls].mn,t[rs].mn);
t[id].s=t[ls].s+t[rs].s;
t[id].sum=t[ls].sum+t[rs].sum;
}
node2 ask(int id,int l,int r){
if(t[id].l>=l&&t[id].r<=r){
return {t[id].mx,t[id].mn,t[id].s,t[id].sum};
}
node2 res1,res2;
if(r<=mid)return ask(ls,l,r);
else if(l>mid)return ask(rs,l,r);
else res1=ask(ls,l,r),res2=ask(rs,l,r);
return {max(res1.mx,res2.mx),min(res1.mn,res2.mn),res1.s+res2.s,res1.sum+res2.sum};
}
signed main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,n,1);
for(int i=1;i<=m;i++){
int c,x,y;
scanf("%d%d%d",&c,&x,&y);
if(c==1){
update(1,x,y);
}
else {
node2 ans=ask(1,x,y);
if(ans.s==(int)pow((int)(1+ans.mx)*ans.mx/2,2)-(int)pow((int)(ans.mn-1)*ans.mn/2,2)&&ans.sum==(1+y)*y/2-(x-1)*x/2)printf("damushen\n");
else printf("yuanxing\n");
}
}
return 0;
}