区间哈希+特判
#include <iostream>
#include <cstdio>
using namespace std;
int read()
{
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return f*x;
}
const int N=500005;
int n,m,sum[N*4],tre[N*4],mx[N*4],mi[N*4],squ[N*4];
int l,r,f,a,b,c[N],w,v,p,x,y,z;
void build(int k,int l,int r)
{
if(l==r)
{
sum[k]=tre[k]=mx[k]=mi[k]=c[l];
squ[k]=c[l]*c[l];
return;
}
int mid=(l+r)/2;
build(k*2,l,mid);
build(k*2+1,mid+1,r);
tre[k]=tre[k*2]^tre[k*2+1];
sum[k]=sum[k*2]+sum[k*2+1];
squ[k]=squ[k*2]+squ[k*2+1];
mx[k]=max(mx[k*2],mx[k*2+1]);
mi[k]=min(mi[k*2],mi[k*2+1]);
}
void change(int k,int l,int r,int x,int v)
{
if(l>x||r<x) return;
if(l==r)
{
sum[k]=tre[k]=mx[k]=mi[k]=v;
squ[k]=v*v;
return;
}
int mid=(l+r)/2;
change(k*2,l,mid,x,v);
change(k*2+1,mid+1,r,x,v);
tre[k]=tre[k*2]^tre[k*2+1];
sum[k]=sum[k*2]+sum[k*2+1];
squ[k]=squ[k*2]+squ[k*2+1];
mx[k]=max(mx[k*2],mx[k*2+1]);
mi[k]=min(mi[k*2],mi[k*2+1]);
}
int query_squ(int k,int l,int r,int x,int y)
{
if(l>y||r<x) return 0;
if(l>=x&&r<=y) return squ[k];
int mid=(l+r)/2,ret=0;
ret+=query_squ(k*2,l,mid,x,y);
ret+=query_squ(k*2+1,mid+1,r,x,y);
return ret;
}
int query_sum(int k,int l,int r,int x,int y)
{
if(l>y||r<x) return 0;
if(l>=x&&r<=y) return sum[k];
int mid=(l+r)/2,ret=0;
ret+=query_sum(k*2,l,mid,x,y);
ret+=query_sum(k*2+1,mid+1,r,x,y);
return ret;
}
int query_xor(int k,int l,int r,int x,int y)
{
if(l>y||r<x) return 0;
if(l>=x&&r<=y) return tre[k];
int mid=(l+r)/2,ret=0;
ret^=query_xor(k*2,l,mid,x,y);
ret^=query_xor(k*2+1,mid+1,r,x,y);
return ret;
}
int query_min(int k,int l,int r,int x,int y)
{
if(l>y||r<x) return 2147483647;
if(l>=x&&r<=y) return mi[k];
int mid=(l+r)/2,ret=2147483647;
ret=min(ret,query_min(k*2,l,mid,x,y));
ret=min(ret,query_min(k*2+1,mid+1,r,x,y));
return ret;
}
int query_max(int k,int l,int r,int x,int y)
{
if(l>y||r<x) return -2147483647;
if(l>=x&&r<=y) return mx[k];
int mid=(l+r)/2,ret=-2147483647;
ret=max(ret,query_max(k*2,l,mid,x,y));
ret=max(ret,query_max(k*2+1,mid+1,r,x,y));
return ret;
}
int main()
{
n=read(); m=read();
for(int i=1;i<=n;i++) c[i]=read();
build(1,1,n);
for(int i=1;i<=m;i++)
{
f=read(); a=read(); b=read();
if(f==1) change(1,1,n,a,b);
if(f==2) {
l=query_min(1,1,n,a,b);
r=query_max(1,1,n,a,b);
if((r-l)!=(b-a)) {
cout<<"yuanxing\n";
continue;
}
x=query_sum(1,1,n,a,b);
y=query_xor(1,1,n,a,b);
z=query_squ(1,1,n,a,b);
w=0; v=0; p=0;
for(int j=l;j<=r;j++) {
w+=j; v^=j; p+=j*j;
}
if(x==w&&y==v&&p==z) cout<<"damushen\n";
else cout<<"yuanxing\n";
}
}
return 0;
}