求调
查看原帖
求调
820550
anlanyi楼主2024/4/10 14:31
// #pragma GCC optimize(3,"Ofast","inline")
// #pragma GCC optimize(2)
#include <bits/stdc++.h>
using namespace std;
#define all(v) v.begin(), v.end()
#define point(n) fixed << setprecision(n)
#define IOS                      \
    ios::sync_with_stdio(false); \
    cin.tie(0), cout.tie(0);
#define debug(a) cout << "=======" << a << "========" << endl;
#define endl '\n'
#define inf 0x3f3f3f3f
typedef long long ll;
typedef pair<ll, ll> PII;
typedef pair<ll, array<ll, 2>> PIA;
const int N = 1e6 + 10, mod = 1e9 + 7;
const double eps = 1e-8;
const ll INF = 0x3f3f3f3f3f3f3f3f;
int n, m, k;
int f[N];
struct node
{
 int l,r;
 ll sum,la=-INF,lb;   /* data */
}tr[4*N];
void pushup(int u)
{
    tr[u].sum=max(tr[u<<1].sum,tr[u<<1|1].sum);
}
void pushdown(int u)
{
    if(tr[u].la!=-INF){

       // cout<<tr[u].la<<' '<<u<<endl;
        tr[u<<1].la=tr[u<<1|1].la=tr[u].la;
        tr[u<<1].sum=tr[u].la;
        tr[u<<1|1].sum=tr[u].la;
        tr[u].la=-INF;
        tr[u].lb=0;
        
       // tr[u<<1].lb=0,tr[u<<1|1].lb=0;
    }
    if(tr[u].lb){
        tr[u<<1|1].lb+=tr[u].lb;
        tr[u<<1].lb+=tr[u].lb;
        tr[u<<1].sum+=tr[u].lb;
        tr[u<<1|1].sum+=tr[u].lb;
        tr[u].lb=0;
    }
        
    
}
void build(int u,int l,int r)
{
    
    tr[u]={l,r};
    if(l==r){
        tr[u].sum=f[l];
        return ;
    }
    int mid=l+r>>1;
    build(u<<1,l,mid);
    build(u<<1|1,mid+1,r);
    pushup(u);
}
void modify1(int u,int l,int r,ll  x)
{
    if(tr[u].l>=l&&tr[u].r<=r){
        tr[u].la=x;
        tr[u].sum=x;
      //  pushdown(u);
        return ;
    }
    pushdown(u);
    int mid=tr[u].l+tr[u].r>>1;
    if(l<=mid)modify1(u<<1,l,r,x);
    if(r>mid)modify1(u<<1|1,l,r,x);
    pushup(u);
}
void modify2(int u,int l,int r,ll x)
{
    
    if(tr[u].l>=l&&tr[u].r<=r){
        //cout<<tr[u].sum<<' '<<x<<endl;
        tr[u].lb+=x;
        tr[u].sum+=x;
       // cout<<tr[u].sum<<endl;
        
        //  pushdown(u);
        return ;
    }
    int mid=tr[u].l+tr[u].r>>1;
    pushdown(u);
    if(l<=mid)modify2(u<<1,l,r,x);
    if(r>mid)modify2(u<<1|1,l,r,x);
    pushup(u);
}
ll query(int u,int l,int r)
{
    if(tr[u].l>=l&&tr[u].r<=r){
        return tr[u].sum;
    }
    int mid=tr[u].l+tr[u].r>>1;
    pushdown(u);
    ll ans=-1e18;
    if(l<=mid)ans=max(ans,query(u<<1,l,r));
    if(r>mid)ans=max(ans,query(u<<1|1,l,r));
    return ans;
}
void solve()
{
    cin >>n >> m;
    for(int i=1;i<=n;i++)cin >> f[i];
    build(1,1,n);
 
    while(m--){
        ll  a,b,c,d;
        cin >> a >>  b >> c;
        if(a==1){
            cin >>d;
            modify1(1,b,c,d);
        }else if(a==2){
            cin >>d;
            
            modify2(1,b,c,d);
        }else {
           // cout<<query(1,c,c);
            cout<<query(1,b,c)<<endl;
        }
        // cout<<query(1,1,n)<<endl;
    }
}
int main()
{
    IOS;
    int _ = 1;
   // cin >> _;
    while (_--)
    {
        solve();
    }
    return 0;
}
2024/4/10 14:31
加载中...