用过自然溢出和取模都不对,挂在同两个点上。平方和前缀是预处理出来的。应该不是被卡,因为死因都是
read y, expected d
也不知道为什么正确的会被判成错误(
#include <cstdio>
#include <cctype>
#include <algorithm>
#include <cmath>
#define ll long long
#define mod 998244353
#define inf 0x3f3f3f3f
using namespace std;
inline int read(){
int x=0,w=0;char ch=getchar();
while (!isdigit(ch))w|=ch=='-',ch=getchar();
while (isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar();
return w?-x:x;
}
struct node{
int val, maxn, minn;
}a[8000005];
int n, m, sum[25000005], minn, maxn, tot;
inline int ls(int p){
return p << 1;
}
inline int rs(int p){
return p << 1 | 1;
}
inline void update(int p){
a[p].maxn = max(a[ls(p)].maxn , a[rs(p)].maxn );
a[p].minn = min(a[ls(p)].minn , a[rs(p)].maxn );
a[p].val = (a[ls(p)].val + a[rs(p)].val) % mod ;
}
inline void build(int p, int l, int r){
if(l == r){
a[p].maxn = a[p].minn = read();
a[p].val = (1ll * a[p].maxn * a[p].maxn) % mod;
return ;
}
int mid = l + r >> 1;
build(ls(p), l, mid);
build(rs(p), mid + 1, r);
update(p);
}
inline void modify(int p, int l, int r, int k, int val){
if(l == r){
a[p].maxn = a[p].minn = val;
a[p].val = (1ll * val * val) % mod;
return ;
}
int mid = l + r >> 1;
if(k <= mid) modify(ls(p), l, mid, k, val);
else modify(rs(p), mid + 1, r, k, val);
update(p);
}
inline void query(int p, int l, int r, int L, int R){
if(L <= l && r <= R){
maxn = max(maxn, a[p].maxn );
minn = min(minn, a[p].minn );
tot = (tot + a[p].val) % mod ;
return ;
}
int mid = l + r >> 1;
if(L <= mid) query(ls(p), l, mid, L, R);
if(mid < R) query(rs(p), mid + 1, r, L, R);
}
int main(){
// freopen("ans.out","w",stdout);
n = read(), m = read();
for(int i = 1; i <= 25000000; i++){
sum[i] = (sum[i - 1] + (1ll * i * i) % mod) % mod;
}
build(1, 1, n);
for(int i = 1; i <= m; i++){
int opt = read(), x = read(), y = read();
if(opt == 1){
modify(1, 1, n, x, y);
}
else {
maxn = -inf, minn = inf;
tot = 0;
query(1, 1, n, x, y);
if(maxn - minn != y - x){
puts("yuanxing");
}
else {
if((sum[maxn] - sum[minn - 1] + mod) % mod == tot % mod){
puts("damushen");
}
else puts("yuanxing");
}
}
}
}