50分,错4,超时1,求大佬帮调

P1253 扶苏的问题

Guanrenhan @ 2024-07-29 21:39:02

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,m,a[1000001],t1[4000001];
struct Tree{
  int l,r,num,tag1,tag2;
}t[4000001];
void pushdown(int i)
{
  if(t1[i]==1)
  {
    t[i*2].tag2=t[i*2+1].tag2=0;
    t[i*2].tag1=t[i].tag1;
    t[i*2].num=t[i].tag1;
    t1[i*2]=1;
    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;
    return ;
  }
  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(int i)
{
  t[i].num=max(t[i*2].num,t[i*2+1].num);
  return ;
}
void build(int i,int l,int r)
{
    t[i].l=l;
    t[i].r=r;
    if(l==r)
    {
        t[i].num=a[l];
        return ;
    }
    int mid=(l+r)/2;
    build(i*2,l,mid);
    build(i*2+1,mid+1,r);
    pushup(i);
}
void update_1(int i,int l,int r,int num)
{
    if(l<=t[i].l&&t[i].r<=r)
    {
        t1[i]=1;
        t[i].num=t[i].tag1=num;
        return ;
    }
    pushdown(i);
    int 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(int i,int l,int r,int num)
{
    if(l<=t[i].l&&t[i].r<=r)
    {
        t[i].num+=num;
        t[i].tag2+=num;
        return ;
    }
    pushdown(i);
    int 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);
}
int query(int i,int l,int r)
{
    if(l<=t[i].l&&t[i].r<=r)
      return t[i].num;
    pushdown(i);
    int mid=(t[i].l+t[i].r)/2,sum=0;
    if(l<=mid)
      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(int i=1;i<=n;i++)
    cin>>a[i];
  build(1,1,n);
  for(int i=1,k,l,r,x;i<=m;i++)
  {
      cin>>k>>l>>r;
      if(k==1)
      {
        cin>>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;
}

|