求hack悬关
查看原帖
求hack悬关
235901
Always_Remember_It楼主2023/10/7 20:01
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+10;
const int MINN=-0x7f7f7f7f7f7f7f7f;
int n,m,a[N],num,in[N],lt[N],rt[N],maxx[N],p[N],ext[N];
bool k[N],kn[N];
void block(){
	num=sqrt(n);
	if(num*num!=n) ++num;
	int lar=num;
	if(num*(num-1)>=n&&num*num!=n) --lar;
	for(int i=1;i<num;i++){
		lt[i]=rt[i-1]+1;
		rt[i]=i*lar;
	}
	lt[num]=rt[num-1]+1;
	rt[num]=n;
	for(int i=1;i<=rt[num-1];i++){
		in[i]=(i-1)/lar+1;
	}
	for(int i=lt[num];i<=n;i++){
		in[i]=num;
	}
	for(int i=1;i<=num;i++){
		maxx[i]=MINN;
		for(int j=lt[i];j<=rt[i];j++){
			if(a[j]>=maxx[i]){
				maxx[i]=a[j];
				p[i]=j;
			}
		}
	}
}
void change(int x,int val,bool t){
	a[x]=val-a[x]-ext[in[x]];
	maxx[in[x]]=a[x];
	p[in[x]]=x;
	for(int i=lt[in[x]];i<=rt[in[x]];i++){
		if(i==x) continue;
		a[i]+=ext[in[x]];
		if(a[i]>=maxx[in[x]]){
			maxx[in[x]]=a[i];
			p[in[x]]=max(p[in[x]],i);
		}
	}
	ext[in[x]]=0;
	if(!t){
		k[x]=0;
		for(int i=lt[in[x]];i<=rt[in[x]];i++){
			if(k[i]) return;
		}
		kn[in[x]]=0;
		return;
	}
	k[x]=1;
	kn[in[x]]=1;
}
int ask(int l,int r){
	int maxn=MINN,pt=0;
	if(in[l]==in[r]){
		for(int i=l;i<=r;i++){
			if(a[i]+ext[in[l]]>=maxn){
				maxn=a[i]+ext[in[l]];
				pt=i;
			}
		}
		for(int i=l;i<=r;i++){
			if(k[i]) pt=i,maxn=a[i]+ext[in[l]];
		}
		change(pt,a[pt]+ext[in[pt]],0);
		return maxn;
	}
	for(int i=l;i<=rt[in[l]];i++){
		if(a[i]+ext[in[l]]>=maxn){
			maxn=a[i]+ext[in[l]];
			pt=i;
		}
	}
	for(int i=in[l]+1;i<in[r];i++){
		if(maxx[i]+ext[i]>=maxn){
			maxn=maxx[i]+ext[i];
			pt=p[i];
		}
	}
	for(int i=lt[in[r]];i<=r;i++){
		if(a[i]+ext[in[r]]>=maxn){
			maxn=a[i]+ext[in[r]];
			pt=i;
		}
	}
	for(int i=l;i<=rt[in[l]];i++){
		if(k[i]) pt=i,maxn=a[i]+ext[in[l]];
	}
	for(int i=in[l]+1;i<in[r];i++){
		if(kn[i]){
			for(int j=lt[i];j<=rt[i];j++){
				if(k[j]) pt=j,maxn=a[j]+ext[i];
			}
			break;
		}
	}
	for(int i=lt[in[r]];i<=r;i++){
		if(k[i]) pt=i,maxn=a[i]+ext[in[r]];
	}
	change(pt,a[pt]+ext[in[pt]],0);
	return maxn;
}
void update(int l,int r,int val){
 	maxx[in[l]]=MINN;
 	for(int i=lt[in[l]];i<l;i++){
		if(a[i]>=maxx[in[l]]){
			maxx[in[l]]=a[i];
			p[in[l]]=i;
		}
	}
	for(int i=l;i<=r;i++){
		a[i]+=val;
		if(a[i]>=maxx[in[l]]){
			maxx[in[l]]=a[i];
			p[in[l]]=i;
		}
	}
	for(int i=r+1;i<=rt[in[l]];i++){
		if(a[i]>=maxx[in[l]]){
			maxx[in[l]]=a[i];
			p[in[l]]=i;
		}
	}
}
void past(int l,int r,int val){
	if(in[l]==in[r]){
		update(l,r,val);
		return;
	}
	update(l,rt[in[l]],val);
	update(lt[in[r]],r,val);
	for(int i=in[l]+1;i<in[r];i++){
		ext[i]+=val;
	}
}
inline int read(){
	int s=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		s=(s<<3)+(s<<1)+(ch^48);
		ch=getchar();
	}
	return s*f;
}
signed main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	block();
	int sum=0;
	for(int i=1;i<=m;i++){
		int op=read();
		if(op==1){
			int x=read(),val=read();
			change(x,val,1);
			continue;
		}
		int l=read(),r=read();
		if(op==2){
			int now=ask(l,r);
			sum+=now;
   			printf("%d\n",now);
			continue;
		}
		int val=read();
		past(l,r,val);
	}
	if(sum<10000) printf("QAQ\n");
	else if(sum<10000000) printf("Sakura\n");
	else printf("ice\n");
	return 0;
}
2023/10/7 20:01
加载中...