毒瘤代码37pts求调
查看原帖
毒瘤代码37pts求调
299883
HYdroKomide楼主2023/1/15 10:04

树状数组维护二三次方和,线段树维护区间 min max,__int128 自然溢出。

#include<cstdio>
#include<algorithm>
#include<set>
#include<cmath>
using namespace std;
typedef __int128 ll;
namespace FASTIO{
	inline ll read(){
	    register ll x=0,f=1;
		static char ch=getchar();
	    while(ch>'9'||ch<'0'){
			if(ch=='-')f=-1;
			ch=getchar();
		}
	    while(ch>='0'&&ch<='9'){
			x=(x<<3)+(x<<1)+(ch^48);
			ch=getchar();
		}
	    return x*f;
	}
	inline void write(ll x){
	    if(x<0)putchar('-'),x=-x;
	    register int i=0;
	    static char s[30];
	    while(x||i==0)s[i++]=x%10+'0',x/=10;
	    while(i--)putchar(s[i]);
	    putchar('\n');
	}
}
using namespace FASTIO;
const int N=5e5+1;
ll n,m,a[N],tsq[N],tcb[N],mx[4*N],mn[4*N];
inline void addsq(ll x,ll y){
	while(x<=n){
		tsq[x]+=y*y;
		x+=x&(-x);
	}
}
inline void addcb(ll x,ll y){
	while(x<=n){
		tcb[x]+=y*y*y;
		x+=x&(-x);
	}
}
inline void mnssq(ll x,ll y){
	while(x<=n){
		tsq[x]-=y*y;
		x+=x&(-x);
	}
}
inline ll qrysq(ll x){
	ll ret=0;
	while(x){
		ret+=tsq[x];
		x-=x&(-x);
	}
	return ret;
}
inline ll qrycb(ll x){
	ll ret=0;
	while(x){
		ret+=tcb[x];
		x-=x&(-x);
	}
	return ret;
}
inline int ls(ll x){return x<<1;}
inline int rs(ll x){return x<<1|1;}
inline void pushup(ll x){
	mx[x]=mx[ls(x)]>mx[rs(x)]?mx[ls(x)]:mx[rs(x)];
	mn[x]=mn[ls(x)]<mn[rs(x)]?mn[ls(x)]:mn[rs(n)];
}
inline void pushdown(ll x,ll val){
	mx[x]=val;
	mn[x]=val;
}
void build(ll x,ll l,ll r){
	if(l==r){
		pushdown(x,a[l]);
		return;
	}
	int mid=(l+r)>>1;
	build(ls(x),l,mid);
	build(rs(x),mid+1,r);
	pushup(x);
}
void update(ll x,ll l,ll r,ll X,ll k){
	if(l==r){
		pushdown(x,k);
		return;
	}
	int mid=(l+r)>>1;
	if(X<=mid)update(ls(x),l,mid,X,k);
	else update(rs(x),mid+1,r,X,k);
	pushup(x);
}
ll querymax(ll L,ll R,ll l,ll r,ll x){
	ll ans=-2e9;
	if(L<=l&&R>=r)return mx[x];
	int mid=(l+r)>>1;
	if(L<=mid)ans=max(ans,querymax(L,R,l,mid,ls(x)));
	if(R>mid)ans=max(ans,querymax(L,R,mid+1,r,rs(x)));
	return ans;
}
ll querymin(ll L,ll R,ll l,ll r,ll x){
	ll ans=2e9;
	if(L<=l&&R>=r)return mn[x];
	int mid=(l+r)>>1;
	if(L<=mid)ans=min(ans,querymin(L,R,l,mid,ls(x)));
	if(R>mid)ans=min(ans,querymin(L,R,mid+1,r,rs(x)));
	return ans;
}
int main(){
    n=read(),m=read();
    for(int i=1;i<=n;i++){
    	a[i]=read();
		addsq(i,a[i]);
		addcb(i,a[i]);
	}
	build(1,1,n);
    while(m--){
    	ll op,x,y;
    	op=read(),x=read(),y=read();
    	if(op==1){
    		mnssq(x,a[x]);
    		addcb(x,-a[x]);
    		update(1,1,n,x,y);
    		a[x]=y;
    		addsq(x,a[x]);
    		addcb(x,a[x]);
		}
		else{
			ll tmpmx=querymax(x,y,1,n,1),tmpmn=querymin(x,y,1,n,1),tmpsq=qrysq(y)-qrysq(x-1),tmpcb=qrycb(y)-qrycb(x-1);
			ll rsq,rsm1,rsm2,rcb;
			rsq=tmpmx*(tmpmx+1)*(2*tmpmx+1)-tmpmn*(tmpmn-1)*(2*tmpmn-1);
			rsm1=(1+tmpmx)*tmpmx/2;
			rsm2=(tmpmn-1)*tmpmn/2;
			rcb=rsm1*rsm1-rsm2*rsm2;
			if(tmpsq*6==rsq&&tmpcb==rcb)printf("damushen\n");
			else printf("yuanxing\n");
		}
	}
    return 0;
}
2023/1/15 10:04
加载中...