rt,挺离谱的,调了快1h也没看出来维护的平方和到底哪里出问题了...
#include <bits/stdc++.h>
#define maxn 501000
using namespace std;
typedef long long ll;
const int mod = 1000007;
// const lsl INF=100000000000000000;
int num[maxn];
struct node{
int l, r, siz;
ll mi, ma, sum, ssum; //注意:ssum为平方和
};
struct SegmentTree{
node tr[maxn];
//-----一大堆便利的宏定义--------
#define ls p*2
#define rs p*2+1
#define lp tr[p].l
#define rp tr[p].r
// #define mid (lp+rp)>>1
#define psiz tr[p].siz
#define padd tr[p].add
#define psum tr[p].sum
#define pssum tr[p].ssum
//-----一大堆便利的宏定义--------
inline void pushup(int p){
tr[p].ma = max(tr[ls].ma, tr[rs].ma), tr[p].mi = min(tr[ls].mi, tr[rs].mi);
psum = (tr[ls].sum + tr[rs].sum + mod) % mod;
pssum = (tr[rs].ssum + tr[ls].ssum) % mod;
}
inline void build(int p,int l,int r){
lp = l, rp = r;
if(l == r){
tr[p].ssum = num[l] * num[l] % mod; //平方和
tr[p].sum = num[l] % mod;
tr[p].ma = tr[p].mi = num[l];
return;
}
int mid = (l + r) >> 1;
build(ls, l, mid);
build(rs, mid + 1, r);
pushup(p);
}
inline void change(int p,int l,int r, int q,int z){
if(r == l){
tr[p].ma = tr[p].mi = psum = z;
pssum = z * z % mod;
return;
}
int mid = (l + r) >> 1;
if(q <= mid) change(ls, l, mid, q, z);
else change(rs, mid + 1, r, q, z);
pushup(p);
}
inline ll ask_mi(int p,int l,int r){
if(l <= lp && r >= rp) return tr[p].mi;
ll ans = LONG_LONG_MAX;
int mid = (lp + rp) >> 1;
if(l <= mid) ans = min(ans, ask_mi(ls, l, r));
if(r > mid) ans = min(ans, ask_mi(rs, l, r));
return ans;
}
inline ll ask_ma(int p,int l,int r){
if(l <= lp && r >= rp) return tr[p].ma;
ll ans = LONG_LONG_MIN;
int mid = (lp + rp) >> 1;
if(l <= mid) ans = max(ans, ask_ma(ls, l, r));
if(r > mid) ans = max(ans, ask_ma(rs, l, r));
return ans;
}
inline ll ask_sum(int p,int l,int r){
if(l <= lp && r >= rp) return psum;
ll ans = 0;
int mid = (lp + rp) >> 1;
if(l <= mid) ans = (ans + ask_sum(ls, l, r)) % mod;
if(r > mid) ans = (ans + ask_sum(rs, l, r)) % mod;
return ans;
}
inline ll ask_ssum(int p,int l,int r){
if(l <= lp && r >= rp) return (pssum + mod)% mod;
ll ans = 0;
int mid = (lp + rp) >> 1;
if(l <= mid) ans = (ans + ask_ssum(ls, l, r) + mod) % mod;
if(r > mid) ans = (ans + ask_ssum(rs, l, r) + mod) % mod;
return ans;
}
inline bool ask_legal(int l,int r){
ll mi = ask_mi(1, l, r), ma = ask_ma(1, l, r), ssum = ask_ssum(1, l, r), sum = ask_sum(1, l, r);
cout << mi << ' ' << ma << ' ' << sum << ' ' << ssum << endl;
if(((ma * (ma + 1) * (2 * ma + 1)) % mod - ((mi - 1) * mi * (2 * mi - 1)) % mod + mod) % mod == ssum * 6 % mod && ((mi + ma) * (r - l + 1) % mod) == sum * 2 % mod) return true;
return false;
}
//-----一大堆解除-------
#undef ls
#undef rs
#undef psum
#undef psiz
#undef padd
#undef pssum
#undef rp
#undef lp
//-----一大堆解除-------
}tree;
int n, m, opt, x, y;
int main(){
// freopen("1.in", "r" ,stdin);
// freopen("ans.out", "w", stdout);
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n >> m;
for(int i = 1; i <= n; i++) cin >> num[i];
tree.build(1, 1, n);
while(m--){
cin >> opt >> x >> y;
if(opt == 1) tree.change(1, 1, n, x, y);
else cout << (tree.ask_legal(x, y) ? "damushen" : "yuanxing") << '\n';
}
return 0;
}