3错1超时,求大佬们帮看看

P1253 扶苏的问题

Guanrenhan @ 2024-08-03 21:01:19


#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
long long n,m,a[1000001],t1[4000001];
struct Tree{
  long long l,r,num,tag1,tag2;
}t[4000001];
void pushdown(long long i)
{
  if(t1[i]==1)
  {
    t[i*2].tag2=0;
    t[i*2].tag1=t[i].tag1;
    t[i*2].num=t[i].tag1;
    t1[i*2]=1;
    t[i*2+1].tag2=0;
    t[i*2+1].tag1=t[i].tag1;
    t[i*2+1].num=t[i].tag1;
    t1[i*2+1]=1;
    t1[i]=0;
    t[i].tag1=0;
  }
  else
  {
    t[i*2].tag2+=t[i].tag2;
    t[i*2+1].tag2+=t[i].tag2;
    t[i*2].num+=t[i].tag2;
    t[i*2+1].num+=t[i].tag2;
    t[i].tag2=0;
  }
  return ;
}
void pushup(long long i)
{
  t[i].num=max(t[i*2].num,t[i*2+1].num);
  return ;
}
void build(long long i,long long l,long long r)
{
    t[i].l=l;
    t[i].r=r;
    if(l==r)
    {
        t[i].num=a[l];
        return ;
    }
    long long mid=(l+r)/2;
    build(i*2,l,mid);
    build(i*2+1,mid+1,r);
    pushup(i);
}
void update_1(long long i,long long l,long long r,long long num)
{
    if(l<=t[i].l&&t[i].r<=r)
    {
        t1[i]=1;
        t[i].num=t[i].tag1=num;
        return ;
    }
    pushdown(i);
    long long mid=(t[i].l+t[i].r)/2;
    if(l<=mid)
      update_1(i*2,l,r,num);
    if(r>mid)
      update_1(i*2+1,l,r,num);
    pushup(i);
    return ;
}
void update_2(long long i,long long l,long long r,long long num)
{
    if(l<=t[i].l&&t[i].r<=r)
    {
        t[i].num+=num;
        t[i].tag2+=num;
        return ;
    }
    pushdown(i);
    long long mid=(t[i].l+t[i].r)/2;
    if(l<=mid)
      update_2(i*2,l,r,num);
    if(r>mid)
      update_2(i*2+1,l,r,num);
    pushup(i);
}
long long query(long long i,long long l,long long r)
{
    if(l<=t[i].l&&t[i].r<=r)
      return t[i].num;
    pushdown(i);
    long long mid=(t[i].l+t[i].r)/2,sum=-9999999999999;
    if(l<=mid)
      sum=max(sum,query(i*2,l,r));
    if(r>mid)
      sum=max(sum,query(i*2+1,l,r));
    return sum;
}
int main()
{
  cin>>n>>m;
  for(long long i=1;i<=n;i++)
    scanf("%lld",&a[i]);
  build(1,1,n);
  for(long long i=1,k,l,r,x;i<=m;i++)
  {
      scanf("%lld%lld%lld",&k,&l,&r);
      if(k==1)
      {
        scanf("%lld",x);
        update_1(1,l,r,x);
      }
      if(k==2)
      {
        cin>>x;
        update_2(1,l,r,x);
      }
      if(k==3)
        cout<<query(1,l,r)<<endl;
  }
  return 0;
}```

|