萌新A了,但是卡着实现过的,求卡常
查看原帖
萌新A了,但是卡着实现过的,求卡常
1248522
mlvx楼主2024/5/29 16:19

另,这题是Ynoi的吗?

记录

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define pl (p<<1)
#define pr (p<<1|1)
const int N=5e5+10;
struct Tree{int min,max;ll sum,sq;}tr[N<<2];
int n,q,op,l,r,a[N];
void push_up(int p){tr[p].sum=tr[pl].sum+tr[pr].sum,tr[p].sq=tr[pl].sq+tr[pr].sq,tr[p].max=max(tr[pl].max,tr[pr].max),tr[p].min=min(tr[pl].min,tr[pr].min);}
void update(int l,int r,int k,int v,int p){
	if(l==r)return tr[p].sum=tr[p].min=tr[p].max=v,tr[p].sq=1ll*v*v,void();
	int mid=l+r>>1;
	if(k<=mid)update(l,mid,k,v,pl);
	else update(mid+1,r,k,v,pr);
	push_up(p);
}ll query_sum(int l,int r,int le,int ri,int p,int flag){
	if(l>=le&&r<=ri)return flag?tr[p].sum:tr[p].sq;
	int mid=l+r>>1;ll ret=0;
	if(le<=mid)ret+=query_sum(l,mid,le,ri,pl,flag);
	if(ri>mid)ret+=query_sum(mid+1,r,le,ri,pr,flag);
	return push_up(p),ret;
}ll query_max(int l,int r,int le,int ri,int p){
	if(l>=le&&r<=ri)return tr[p].max;
	int mid=l+r>>1;ll ret=0;
	if(le<=mid)ret=max(ret,query_max(l,mid,le,ri,pl));
	if(ri>mid)ret=max(ret,query_max(mid+1,r,le,ri,pr));
	return push_up(p),ret;
}ll query_min(int l,int r,int le,int ri,int p){
	if(l>=le&&r<=ri)return tr[p].min;
	int mid=l+r>>1;ll ret=LLONG_MAX;
	if(le<=mid)ret=min(ret,query_min(l,mid,le,ri,pl));
	if(ri>mid)ret=min(ret,query_min(mid+1,r,le,ri,pr));
	return push_up(p),ret;
}void build(int l,int r,int p){
	if(l==r)return tr[p].sum=tr[p].min=tr[p].max=a[l],tr[p].sq=1ll*a[l]*a[l],void();
	int mid=l+r>>1;
	build(l,mid,pl),build(mid+1,r,pr),push_up(p);
}int main(){
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    build(1,n,1);
    while(q--){
		scanf("%d%d%d",&op,&l,&r);
		if(op==1)update(1,n,l,r,1);
		else{
			int a=query_min(1,n,l,r,1),b=query_max(1,n,l,r,1);ll sum=query_sum(1,n,l,r,1,1),sq=query_sum(1,n,l,r,1,0);
			if(1ll*(a+b)*(b-a+1)==sum*2&&1ll*b*(b+1)*(2*b+1)-1ll*a*(a-1)*(2*a-1)==sq*6)puts("damushen");
			else puts("yuanxing");
		}
    }return 0;
}
2024/5/29 16:19
加载中...