#include "candies.h"
#include<stdlib.h>
#include<stdio.h>
#include<assert.h>
#include <vector>
struct node{
    long long sum,smx,smn;
    friend node operator+(node a,node b){
        node c;
        c.smx=std::max(a.smx,b.smx);
        c.smn=std::min(a.smn,b.smn);
        c.sum=c.smx-c.smn;
        return c;
    }
    node():sum(0),smx(0),smn(0){ }
};
node t[1<<19];
long long lz[1<<19];
void pus(int v,int l,int r){
    if(lz[v]){
        t[v].smn+=lz[v];
        t[v].smx+=lz[v];
        if(l-r){
            lz[v*2+1]+=lz[v];
            lz[v*2+2]+=lz[v];
        }else
            t[v].sum+=lz[v];
        lz[v]=0;
    }
}
void pul(int v,int l,int r){
    if(l!=r) pus(v*2+1,l,(l+r)/2), pus(v*2+2,(l+r)/2+1,r);
    t[v]=t[v*2+1]+t[v*2+2];
}
void update(int v,int l,int r,int x,int y,int k){
    pus(v,l,r);
    if(r<x||y<l)return;
    if(x<=l&&r<=y){
        lz[v]=k;
        pus(v,l,r);return;
    }
    update(v*2+1,l,(l+r)/2,x,y,k);
    update(v*2+2,(l+r)/2+1,r,x,y,k);
    pul(v,l,r);
}
node query(int v,int l,int r,int x,int y){
    pus(v,l,r);
    if(x<=l&&r<=y)return t[v];
    if((l+r)/2<x)return query(v*2+2,(l+r)/2+1,r,x,y);
    if(y<=(l+r)/2)return query(v*2+1,l,(l+r)/2,x,y);
    return query(v*2+1,l,(l+r)/2,x,y)+query(v*2+2,(l+r)/2+1,r,x,y);
}
std::vector<int> distribute_candies(std::vector<int> c, std::vector<int> l, std::vector<int> r, std::vector<int> v) {
    int n=(int)c.size();
    std::vector<std::vector<int>>attach(n);
    auto ADDQUERY=[&](int l,int r,int v,int id){
        attach[l].push_back(id);
        if(r+1<n)attach[r+1].push_back(id|(1<<25));
    };
    l.insert(l.begin(),0);
    r.insert(r.begin(),n-1);
    l.insert(l.begin(),0);
    r.insert(r.begin(),n-1);
    v.insert(v.begin(),1e9+1);
    v.insert(v.begin(),-1e9-1);
    for(int i=0;i<(int)l.size();++i)
        ADDQUERY(l[i],r[i],v[i],i);
    std::vector<int> s(n);
    int q=(int)l.size();
    for(int i=0;i<n;++i){
        for(auto x:attach[i]){
            if((x>>25)&1){
                x^=1<<25;
                update(0,0,q-1,x,q-1,-v[x]);
            }else{
//                printf(" Add %d %d\n",x, v[x]);
                update(0,0,q-1,x,q-1,v[x]);
            }
        }
        int lower,upper,mid,i1,i2,i3;
        i1=i2=-1,i3=-1;
        lower=-1,upper=q-1;
        while(upper-lower>1){
            mid=lower+(upper-lower)/2;
            node x=query(0,0,q-1,mid,q-1);
            if(x.sum>=c[i]) i1=lower=mid;
            else upper=mid;
        }
        assert(~i1);
        lower=i1,upper=q;
        while(upper-lower>1){
            mid=lower+(upper-lower)/2;
            node x=query(0,0,q-1,i1,mid);
            if(x.sum>=c[i]) i2=lower=mid;
            else upper=mid;
        }
        assert(~i1);
        lower=i1,upper=q-1;
        while(upper-lower>1){
            mid=lower+(upper-lower)/2;
            node x=query(0,0,q-1,i1,mid);
            if(x.sum<c[i]) upper=mid;
            else lower=mid;
        }
//        printf(" i2 = %d - 1\n",upper);
        i2=upper-1;
        lower=-1,upper=i2;
        while(upper-lower>1){
            mid=lower+(upper-lower)/2;
            node x=query(0,0,q-1,mid,mid);
            if(x.sum!=query(0,0,q-1,i2,i2).sum) lower=mid;
            else upper=mid;
        }
        i3=lower;
        if(abs(v[i2+1])>=c[i])i3=i2,++i2;
        //printf(" == %d %d, q=%d\n",i1,i2,q); printf(" %lld\n",query(0,0,q-1,i1,i1+1).sum);
        assert(~i2);
       assert(~i3);
        if(i==0){
            //printf(" = %d %d %lld %lld %lld\n",i3,i2,query(0,0,q-1,i1,i1).sum,query(0,0,q-1,i2,i2).sum,query(0,0,q-1,q-1,q-1).sum);
        }
        if(query(0,0,q-1,i3,i3).sum<query(0,0,q-1,i2,i2).sum){
            //if(i==1)puts("EE");
            s[i]=c[i]+(query(0,0,q-1,q-1,q-1).sum-query(0,0,q-1,i2,i2).sum);
        }else{
            s[i]=query(0,0,q-1,q-1,q-1).sum-query(0,0,q-1,i2,i2).sum;
        }
    }
    return s;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |