正常做法,不知道最后一个点错哪里了:
#include <bits/stdc++.h>
using namespace std;
#pragma optimize(2)
#define int long long
const int maxn=2e5+10;
int n,m;
int a[maxn];
int f1[maxn],f2[maxn];
const int biggest=1<<30;
signed main()
{
// freopen("T1.in","r",stdin);
// freopen("T1.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++)
scanf("%lld",&a[i]);
int op,x,y;
int c=0;
for(int j=1;j<=m;j++)
{
scanf("%lld%lld%lld",&op,&x,&y);
if(op==1)
a[x]=y;
if(op==2)
{
c++;
if(y-x>70)
{
printf("Too large\n");
continue;
}
for(int i=x-1;i<=y;i++)
f1[i]=f2[i]=0;
f1[x-1]=f2[x-1]=1;
int ff=0;
for(int i=x;i<=y;i++)
if(a[i]<0)
ff++;
if(ff==1)
{
//cout<<"t"<<endl;
int pos=0;
for(int i=x;i<=y;i++)
{
if(a[i]<0)
{
pos=i;
break;
}
}
int t=1;
int ans=-1e15;
bool flag=0;
for(int i=x;i<pos;i++)
{
t*=a[i];
if(t>biggest)
{
printf("Too large\n");
flag=1;
break;
}
}
if(flag)
continue;
ans=max(ans,t);
t=1;
for(int i=pos+1;i<=y;i++)
{
t*=a[i];
if(t>biggest)
{
printf("Too large\n");
flag=1;
break;
}
}
if(flag)
continue;
ans=max(ans,t);
if(ans>1)
{
printf("%lld\n",ans);
}
else
printf("1\n");
continue;
}
bool flag=0;
int ans=0;
for(int i=x;i<=y;i++)
{
f1[i]=max(a[i],max(f1[i-1]*a[i],f2[i-1]*a[i]));
f2[i]=min(a[i],min(f1[i-1]*a[i],f2[i-1]*a[i]));
if(f1[i]>biggest)
{
printf("Too large\n");
flag=1;
break;
}
ans=max(ans,f1[i]);
}
if(!flag)
{
if(ans>1)
printf("%lld\n",ans);
else
printf("1\n");
}
}
}
return 0;
}