60pts求调
  • 板块P8563 Magenta Potion
  • 楼主ande
  • 当前回复10
  • 已保存回复10
  • 发布时间2022/10/5 08:26
  • 上次更新2023/10/27 08:45:32
查看原帖
60pts求调
573589
ande楼主2022/10/5 08:26
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 7,M = 1073741824;
int n,q;
long long a[N];
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
	while (ch>='0'&&ch<='9'){x=(x<<1) + (x<<3) + (ch - 48);ch=getchar();}
	return x*f;
}
signed  main() {
//freopen("data.in","r",stdin);
//freopen("data.out","w",stdout);
n = read();
q = read();
for(int i  = 1;i <= n;i++){
	a[i] = read();
}
a[0] = 1;
while(q--){
	bool p = true;
	int s = read(), x = read(), y = read();
	if(s == 1){
		a[x] = y;
	}
	else if(s == 2){
		if(y - x + 1 > 61){
			printf("Too large\n");
			continue;
		}
		int l = 0,r = 0,sum = 0;
		int ans1 = 1,ans2 = 1,ans3 = 1,ans4 = 1;
		for(int i = x;i<=y;i++){
			if(a[i] < 0 && l == 0){l = i;}
			if(a[i] < 0)sum ++,r = i;
			if(ans3 >= M || ans3 <= -M) p = false;
			ans3*= a[i];
		}
		if(r == 0)
			r = l;
		if(sum % 2 == 1){
			for(int i = x;i< r;i++)
				ans1 *= a[i];			
			for(int i = l + 1;i<= y;i++)
				ans2 *= a[i];	
			ans4 = max(ans1,ans2);
		}
			
		if(sum == 0 || sum%2 == 0){
			if(ans3 == 0 || p == false)  printf("Too large\n");
			else if(ans3 <= M && ans3 >= -M)printf("%lld\n",ans3);
			else printf("Too large\n");}
		else{
			if(ans4 == 0)
				printf("Too large\n");
			else if(ans4 <= M && ans4 >= -M)
				printf("%lld\n",ans4);
			else
				 printf("Too large\n");}
	}
}
// printf("%lld",M);
  return 0;

}
2022/10/5 08:26
加载中...