#include<bits/stdc++.h>
using namespace std;
#define ls (p<<1)
#define rs (p<<1)|1
#define mid ((l+r)>>1)
#define int long long
const int mod = 1000007;
int n, m, op, x, y, a[2929820];
struct node
{
int max, min, sum, sqs, cbs;
//node(int mx,int mn,int sm,int ss):max(mx),min(mn),sum(sm),sqs(ss){}
}ans[2929820];
node NOD(int a, int b, int c, int d, int e)
{
node res;
res.max = a;
res.min = b;
res.sum = c;
res.sqs = d;
res.cbs = e;
return res;
}
void push_up(int p)
{
ans[p].max = max(ans[ls].max, ans[rs].max) % mod;
ans[p].min = min(ans[ls].min, ans[rs].min) % mod;
ans[p].sum = (ans[ls].sum + ans[rs].sum) % mod;
ans[p].sqs = (ans[ls].sqs + ans[rs].sqs) % mod;
ans[p].cbs = (ans[ls].cbs + ans[rs].cbs) % mod;
}
void build(int l, int r, int p)
{
if (l == r)
{
ans[p] = NOD(a[l], a[l], a[l], (a[l] * a[l]) % mod, (((a[l] * a[l]) % mod) * a[l]) % mod);
return;
}
build(l, mid, ls);
build(mid + 1, r, rs);
push_up(p);
}
void update(int nl, int nr, int l, int r, int p, int k)
{
if (l == r)
{
ans[p] = NOD(k, k, k, (k * k) % mod, (((k * k) % mod) * k) % mod);
return;
}
if (nl <= mid)
update(nl, nr, l, mid, ls, k);
if (nr > mid)
update(nl, nr, mid + 1, r, rs, k);
push_up(p);
}
node query(int nl, int nr, int l, int r, int p)
{
//if (r<nl || l>nr) return;
if (nl <= l && nr >= r)
return ans[p];
node res1 = NOD(-INT_MAX, INT_MAX, 0, 0, 0);
node res2 = NOD(-INT_MAX, INT_MAX, 0, 0, 0);
node res3 = NOD(-INT_MAX, INT_MAX, 0, 0, 0);
if (nl <= mid)
res1 = query(nl, nr, l, mid, ls);
if (nr > mid)
res2 = query(nl, nr, mid + 1, r, rs);
res3.max = max(res1.max, res2.max) % mod;
res3.min = min(res1.min, res2.min) % mod;
res3.sum = (res1.sum + res2.sum) % mod;
res3.sqs = (res1.sqs + res2.sqs) % mod;
res3.cbs = (res1.cbs + res2.cbs) % mod;
return res3;
}
int read()
{
int res = 0, f = 1;
char c = getchar();
while (!isdigit(c))
{
if (c == '-')
f = -1;
c = getchar();
}
while (isdigit(c))
{
res = res * 10 + c - '0';
c = getchar();
}
return res * f;
}
int square(int k)
{
return k * (k + 1) % mod * (2 * k + 1) % mod;
}
int cubic(int k)
{
return k * (k + 1) % mod * k % mod * (k + 1) % mod;
}
void tree(int l,int r,int p)
{
if(l>r)
return;
cout << ans[p].max << " " << ans[p].min << " " << ans[p].sum << " " << ans[p].sqs << " " << ans[p].cbs << endl;
tree(l,mid,ls);
tree(mid+1,r,rs);
}
signed main()
{
// freopen("read.in","r",stdin);
// freopen("ans.out","w",stdout);
n = read();
m = read();
for (int i = 1; i <= n; i++)
a[i] = read();
build(1, n, 1);
for (int i = 1; i <= m; i++)
{
op = read();
x = read();
y = read();
if (op == 1)
update(x, x, 1, n, 1, y);
if (op == 2)
{
node res = query(x, y, 1, n, 1);
if (res.max - res.min != y - x)
printf("yuanxing\n");
else if (res.sum%mod != (((res.max + res.min)%mod) * ((res.max - res.min + 1)%mod) / 2)%mod)
printf("yuanxing\n");
else if (res.sqs * 6 % mod != ((square(res.max) - square(res.min - 1)) % mod + mod) % mod)
printf("yuanxing\n");
else if (res.cbs * 4 % mod != ((cubic(res.max) - cubic(res.min - 1)) % mod + mod) % mod)
printf("yuanxing\n");
else
printf("damushen\n");
}
}
}
#4的数据点我下下来自己对答案是正确的但是交上去就挂了
救救孩子