#include <bits/stdc++.h>
#define int long long
#define maxn 500005
using namespace std;
int n, m, a[maxn];
int ressq, resmaxk, resmink, ressum;
struct node {
int sq, sum, maxk, mink;
}ansn[maxn << 2];
int ls(int x) {
return x << 1;
}
int rs(int x) {
return x << 1 | 1;
}
void pushup(int x) {
ansn[x].maxk = max(ansn[ls(x)].maxk, ansn[rs(x)].maxk);
ansn[x].mink = min(ansn[ls(x)].mink, ansn[rs(x)].mink);
ansn[x].sq = ansn[ls(x)].sq + ansn[rs(x)].sq;
ansn[x].sum = ansn[ls(x)].sum + ansn[rs(x)].sum;
}
void build(int p, int l, int r) {
int mid = (l + r) >> 1;
if(l == r) {
ansn[p].maxk = a[l];
ansn[p].mink = a[l];
ansn[p].sq = a[l] * a[l];
ansn[p].sum = a[l];
return;
}
build(ls(p), l, mid);
build(rs(p), mid + 1, r);
pushup(p);
}
void change(int p, int l, int r, int nl, int k) {
if(l == r) {
ansn[p].sq = k * k;
ansn[p].sum = k;
ansn[p].mink = k;
ansn[p].maxk = k;
return;
}
int mid = (l + r) >> 1;
if(nl <= mid) change(ls(p), l, mid, nl, k);
else change(rs(p), mid + 1, r, nl, k);
pushup(p);
}
void query(int p, int l, int r, int nl, int nr) {
int mid = (l + r) >> 1;
if(nl <= l && r <= nr) {
ressq += ansn[p].sq;
resmaxk = max(resmaxk, ansn[p].maxk);
resmink = min(resmink, ansn[p].mink);
ressum += ansn[p].sum;
return;
}
if(nl <= mid) query(ls(p), l, mid, nl, nr);
if(nr > mid) query(rs(p), mid + 1, r, nl, nr);
}
signed main() {
scanf("%lld%lld", &n, &m);
for(int i = 1;i <= n;i++) scanf("%lld", &a[i]);
build(1, 1, n);
for(int i = 1;i <= m;i++) {
int op, x, y;
scanf("%lld%lld%lld", &op, &x, &y);
if(op == 1) {
change(1, 1, n, x, y);
}
else {
ressq = 0, resmaxk = -__INT_MAX__, resmink = __INT_MAX__, ressum = 0;
query(1, 1, n, x, y);
resmink--;
int p = resmaxk * (resmaxk + 1) * (resmaxk * 2 + 1) / 6 - resmink * (resmink + 1) * (resmink * 2 + 1) / 6;
if(p == ressq && resmaxk - resmink == y - x + 1) printf("damushen\n");
else printf("yuanxing\n");
}
}
}
最大的那几个点过不去, 怀疑爆long long了(?)