不知道为什么输出了负数,我觉的我找 [l,r] 最左边和最右边的负数没问题啊。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<map>
#define ls o<<1
#define rs o<<1|1
using namespace std;
typedef long long ll;
const int N=2e5+10;
const int MAXN=1073741824;
ll tr[N<<2];
int flag[N<<2];
int n,q;
ll a[N];
void read(ll &x){
int fx=1;
x=0;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') fx=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
x=x*fx;
}
int main()
{
scanf("%d%d",&n,&q);
for(int i=1;i<=n;i++)
{
read(a[i]);
}
for(int i=1;i<=q;i++)
{
int op;
scanf("%d",&op);
if(op==1)
{
int d;
ll x;
scanf("%d%lld",&d,&x);
a[d]=x;
}
else
{
ll l,r;
read(l),read(r);
if(r-l+1>=61)
{
printf("Too large\n");
continue;
}
ll ans=1,res=1;
bool flag=false;
int L=l-1,R=r+1;
for(int j=l;j<=r;j++)
{
if(a[j]<0)
{
L=j;
break;
}
}
for(int j=r;j>=l;j--)
{
if(a[j]<0)
{
R=j;
break;
}
}
for(int j=L+1;j<=r;j++)
{
ans*=a[j];
if(abs(ans)>MAXN)
{
flag=true;
break;
}
}
for(int j=l;j<=R-1;j++)
{
res*=a[j];
if(abs(res)>MAXN)
{
flag=true;
break;
}
}
if(flag)
{
printf("Too large\n");
}
else printf("%lld\n",max(ans,res));
}
}
}