鬼屎

#include <bits/stdc++.h>
using namespace std;
#define ri register int 
#define M 2000005

int n,m;
long long arr[M],brr[M],crr[M];
struct dian{
    int val;
    int l;
}p[M];

struct node{
    int l,r;
    long long  flag=0;
    long long vv;
    long long  val;
    long long  val2;
    long long pos_val_min;
    long long  pos_val_max;
    long long  pos_real;
    long long pos_real2;
    long long pos_vv;
}p[M*4];
void build(int i,int l,int r)
{
    p[i].l=l;p[i].r=r;
    if(l==r)
    {
        return ;
    }
    int mid=(l+r)>>1;
    build(i<<1,l,mid);
    build(i<<1|1,mid+1,r);
}
void upp(int i,int x)
{
    p[i].val=p[i].val-p[i].pos_real+x;
    p[i].val2=p[i].val2-p[i].pos_real2+x;
    p[i].pos_real=x;
    p[i].pos_real2=x;
    p[i].pos_val_max=x;
    p[i].pos_val_min=x;
}
void down(int i)
{
    int tmp=p[i].flag;
    p[i<<1].flag=tmp;
    p[i<<1|1].flag=tmp;
    upp(i<<1,tmp);
    upp(i<<1|1,tmp);
    p[i].flag=0;
}
void up(int i)
{
   if(p[i<<1].val>=p[i<<1|1].val)
   {
        p[i].val=p[i<<1].val;
        p[i].pos_real=p[i<<1].pos_real;
   }
   else
   {
       p[i].val=p[i<<1|1].val;
       p[i].pos_real=p[i<<1|1].pos_real;
   }
   ///////////////
   if(p[i<<1].val2>=p[i<<1|1].val2)
   {
        p[i].val2=p[i<<1].val2;
        p[i].pos_real2=p[i<<1].pos_real2;
   }
   else
   {
       p[i].val2=p[i<<1|1].val2;
       p[i].pos_real2=p[i<<1|1].pos_real2;
   }
   ////////////////
   p[i].pos_val_max=max(p[i<<1].pos_val_max,p[i<<1|1].pos_val_max);
   p[i].pos_val_min=max(p[i<<1|1].pos_val_min,p[i<<1|1].pos_val_min);
}

void xiu(int l,int r,int i,int x)
{
    if(p[i].pos_val_min>x) return ;
    if(p[i].l>r||p[i].r<l) return ;
    if(l<=p[i].l&&p[i].r<=r)
    {
        if(p[i].pos_val_max<=x) 
        {
            p[i].val=p[i].val-p[i].pos_real+x;
            p[i].val2=p[i].val2-p[i].pos_real2+x;
            p[i].pos_real=x;
            p[i].pos_real2=x;
             p[i].pos_val_max=x;
             p[i].pos_val_min=x;
             p[i].flag=x;
             return ;
        }
    }
    if(p[i].flag) down();
    xiu(l,r,i<<1,x);
    xiu(l,r,i<<1|1,x);
    up(i);
}
struct dd{
    int val;
    int pos;
};
dd qu(int l,int r,int i,int x)
{
    dd t;
    t.val=0;t.pos=0;
    if(p[i].l>r||p[i].r<l) return t;
    if(l<=p[i].l&&p[i].r<=r)
    {
        if(p[i].val>=p[i].val2)
        {
            t.val=p[i].val;
            t.pos=p[i].pos_real;
        }
        else 
        {
            t.val=p[i].val2;
            t.pos=p[i].pos_real2;
        }
        return t;
    }
    if(p[i].flag) down();
    dd t1=xiu(l,r,i<<1);
    dd t2=xiu(l,r,i<<1|1);
    up(i);
}
long long 
int main(){
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    
    cin>>n>>m;
    for(ri i=1;i<=n;i++)
    {
        int tmp;
        cin>>tmp;
        arr[i]=arr[i-1]+tmp;
    }
    for(ri i=1;i<=n;i++)
    {
        int tmp;
        cin>>tmp;
        brr[i]=brr[i-1]+tmp;
    }
    for(ri i=1;i<=n;i++)
    {
        int tmp;
        cin>>tmp;
        crr[i]=crr[i-1]+tmp;
    }
    for(ri i=1;i<=m;i++)
    {
        int a,b,c;
        cin>>a>>b>>c;
        dian t;
        t.l=a;t.val=c;
        p[b].push_back(t);
    }
    build(1,1,n);
    for(ri i=1;i<=n;i++)
    {
        xiu(1,1,i,brr[i]-brr[i-1]);
        for(ri j=0;j<p[i].size();j++)
        {
            int l=p[i][j].l;
            int val=p[i][j].val;
            long long tmp=qu(l,i,1);
            xiu2(1,i,i,p[i].val-p[i].pos_real,p[i].val2-p[i].pos_real2);
            
        }
    }
    
    
    
}
View Code

还没有码完, 究极折磨

posted @ 2022-11-03 11:36  VxiaohuanV  阅读(33)  评论(0编辑  收藏  举报