Submission #572659

#TimeUsernameProblemLanguageResultExecution timeMemory
572659tekiJust Long Neckties (JOI20_ho_t1)C++11
9 / 100
1086 ms6640 KiB
#include <bits/stdc++.h>

typedef long long ll;

#define pb push_back
#define MS(x,y) memset((x),(y),sizeof((x)))
#define MN 1000000007

using namespace std;

int tree[800005];
int lazy[800005];

void update(int int_idx, int int_left, int int_right, int left, int right, int val) {
    if (lazy[int_idx] > 0) {
        tree[int_idx] = max(tree[int_idx],lazy[int_idx]);

        if (int_left != int_right) {
            lazy[2*int_idx] = lazy[int_idx];
            lazy[2*int_idx+1] = lazy[int_idx];
        }

        lazy[int_idx] = 0;
    }

    if (int_left > int_right || int_left > right || int_right < left) return;

    if (left <= int_left && int_right <= right) {
        tree[int_idx] = max(tree[int_idx],val);

        if (int_left != int_right) {
            lazy[2*int_idx] = val;
            lazy[2*int_idx+1] = val;
        }
    }

    if (int_left == int_right) return;

    int mid = (int_left+int_right)/2;

    update(2*int_idx,int_left,mid,left,right,val);
    update(2*int_idx+1,mid+1,int_right,left,right,val);

    tree[int_idx] = max(tree[2*int_idx],tree[2*int_idx+1]);
}

int query(int int_idx, int int_left, int int_right, int left, int right) {
    if (lazy[int_idx] > 0) {
        tree[int_idx] = max(tree[int_idx],lazy[int_idx]);

        if (int_left != int_right) {
            lazy[2*int_idx] = lazy[int_idx];
            lazy[2*int_idx+1] = lazy[int_idx];
        }

        lazy[int_idx] = 0;
    }

    if (int_left > int_right || int_left > right || int_right < left) return 0;

    if (left <= int_left && int_right <= right) return tree[int_idx];
    if (int_left == int_right) return 0;

    int mid = (int_left+int_right)/2;

    return max(query(2*int_idx,int_left,mid,left,right), query(2*int_idx+1,mid+1,int_right,left,right));
}

int main()
{
    #if LOCAL_DEBUG
        fstream cin("in.txt");
    #endif

    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);

    int n;
    cin>>n;

    pair<int,int> niza[n+1];
    for (int i = 0; i<n+1; i++) cin>>niza[i].first;
    for (int i = 0; i<n+1; i++) niza[i].second = i;

    int init[n];
    for (int i = 0; i<n; i++) cin>>init[i];

    sort(niza,niza+(n+1));
    sort(init,init+n);

    for (int i = 0; i<n; i++) {
        int br = init[i];
        int prv = niza[i].first;
        int vtor = niza[i+1].first;

        if (vtor-br > 0) update(1,0,n,0,i,vtor-br);
        if (prv-br > 0) update(1,0,n,i+1,n+1,prv-br);
    }

    int res[n+1];
    for (int i = 0; i<n+1; i++) {
        res[niza[i].second] = query(1,0,n,i,i);
    }

    for (int i = 0; i<n+1; i++) cout<<res[i]<<" ";

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...