为什么要开__int128
查看原帖
为什么要开__int128
601122
ECEG楼主2023/9/16 10:54

rt。

开了就过了。

代码:

#include<cstdio>
#define int __int128
template<typename T>void read(T &x){
	x=0;bool f=0;char ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=1;
	for(;ch>='0'&&ch<='9';ch=getchar())x=(x<<1)+(x<<3)+(ch^48);
	if(f)x=-x;
}
void write(char x){putchar(x);}
template<typename T>void write(T x){
	x<0?putchar('-'),x=-x:false;
	char stk[14];int top=0;
	do stk[++top]=x%10+48,x/=10;while(x);
	for(;top;top--)putchar(stk[top]);
}
template<typename T,typename ...Args>void read(T &a,Args &...args){read(a);read(args...);}
template<typename T,typename ...Args>void write(T a,Args ...args){write(a);write(args...);}
template<typename T>T min(T a,T b){return a>b?b:a;}
template<typename T,typename ...Args>T min(T a,T b,Args ...args){return min(a,min(b,args...));}
template<typename T>T max(T a,T b){return a>b?a:b;}
template<typename T,typename ...Args>T max(T a,T b,Args ...args){return max(a,max(b,args...));}
template<typename T>void Swap(T &a,T &b){a^=b^=a^=b;}
template<typename T>T abs(T a){return a<0?-a:a;}
const int maxn=1e5+4;
struct tree{
	#define mid ((l+r)>>1)
	int a[maxn],minn[maxn<<2],maxx[maxn<<2];
	void build(int k,int l,int r,bool flag){
		if(l==r){
			if((a[l]==-1ll&&flag)||(a[l]==1ll&&!flag))minn[k]=1e18,maxx[k]=-1e18;
			else minn[k]=maxx[k]=a[l];
			return;
		}
		build(k<<1,l,mid,flag);build(k<<1|1,mid+1,r,flag);
		minn[k]=min(minn[k<<1],minn[k<<1|1]);
		maxx[k]=max(maxx[k<<1],maxx[k<<1|1]);
	}
	int query_min(int k,int l,int r,int x,int y){
		if(x<=l&&r<=y)return minn[k];
		int ans=1e18;
		if(x<=mid)ans=min(ans,query_min(k<<1,l,mid,x,y));
		if(y>mid)ans=min(ans,query_min(k<<1|1,mid+1,r,x,y));
		return ans;
	}
	int query_max(int k,int l,int r,int x,int y){
		if(x<=l&&r<=y)return maxx[k];
		int ans=-1e18;
		if(x<=mid)ans=max(ans,query_max(k<<1,l,mid,x,y));
		if(y>mid)ans=max(ans,query_max(k<<1|1,mid+1,r,x,y));
		return ans;
	}
	#undef mid
}x,y/*正数*/,xx,yy;
int n,m,q,a[maxn],b[maxn];
signed main(){
	read(n,m,q);
	for(int i=1;i<=n;++i)read(a[i]);
	for(int i=1;i<=m;++i)read(b[i]);
	for(int i=1;i<=n;++i)x.a[i]=max((__int128)-1,a[i]);
	for(int i=1;i<=n;++i)y.a[i]=max((__int128)-1ll,b[i]);
	for(int i=1;i<=n;++i)xx.a[i]=min((__int128)1ll,a[i]);
	for(int i=1;i<=n;++i)yy.a[i]=min((__int128)1ll,b[i]);
	x.build(1,1,n,1);y.build(1,1,n,1);xx.build(1,1,n,0);yy.build(1,1,n,0);
	for(;q--;){
		int l,r,ll,rr;read(l,r,ll,rr);
		int ans=-1e18,ui=0;
		if(y.query_min(1,1,n,ll,rr)!=1e18)ui++,ans=max(ans,xx.query_max(1,1,n,l,r)*y.query_max(1,1,n,ll,rr));
		else ans=max(ans,xx.query_min(1,1,n,l,r)*yy.query_max(1,1,n,ll,rr));
		if(yy.query_max(1,1,n,ll,rr)!=-1e18)ui++,ans=max(ans,x.query_min(1,1,n,l,r)*yy.query_min(1,1,n,ll,rr));
		else ans=max(ans,x.query_max(1,1,n,l,r)*y.query_min(1,1,n,ll,rr));
		write(ans,'\n');
	}
	return 0;
} 
2023/9/16 10:54
加载中...