Submission #725062

#TimeUsernameProblemLanguageResultExecution timeMemory
725062sofija6Wall (IOI14_wall)C++14
100 / 100
993 ms102416 KiB
#include <bits/stdc++.h>
#define ll int
using namespace std;
ll s;
struct element
{
    ll minn=INT_MIN,maxx=INT_MAX;
};
struct seg_tree
{
    vector<element> st,lazy;
    void Init(ll n)
    {
        s=1;
        while (s<n)
            s <<= 1;
        st.resize(2*s+2);
        lazy.resize(2*s+2);
    }
    void Propagate(ll x,ll lx,ll rx)
    {
        if (lazy[x].minn==INT_MIN && lazy[x].maxx==INT_MAX)
            return;
        if (lazy[x].minn!=INT_MIN)
        {
            st[x].minn=max(st[x].minn,lazy[x].minn);
            st[x].maxx=max(st[x].maxx,st[x].minn);
            if (x<s)
            {
                lazy[2*x].minn=max(lazy[2*x].minn,lazy[x].minn);
                lazy[2*x].maxx=max(lazy[2*x].minn,lazy[2*x].maxx);
                lazy[2*x+1].minn=max(lazy[2*x+1].minn,lazy[x].minn);
                lazy[2*x+1].maxx=max(lazy[2*x+1].minn,lazy[2*x+1].maxx);
            }
        }
        if (lazy[x].maxx!=INT_MAX)
        {
            st[x].maxx=min(st[x].maxx,lazy[x].maxx);
            st[x].minn=min(st[x].maxx,st[x].minn);
            if (x<s)
            {
                lazy[2*x].maxx=min(lazy[2*x].maxx,lazy[x].maxx);
                lazy[2*x].minn=min(lazy[2*x].minn,lazy[2*x].maxx);
                lazy[2*x+1].maxx=min(lazy[2*x+1].maxx,lazy[x].maxx);
                lazy[2*x+1].minn=min(lazy[2*x+1].minn,lazy[2*x+1].maxx);
            }
        }
        lazy[x]={INT_MIN,INT_MAX};
    }
    void Add(ll l,ll r,pair<ll,ll> val,ll x,ll lx,ll rx)
    {
        Propagate(x,lx,rx);
        if (lx>r || rx<l)
            return;
        if (lx>=l && rx<=r)
        {
            if (val.first==1)
                lazy[x]={val.second,INT_MAX};
            else
                lazy[x]={INT_MIN,val.second};
            Propagate(x,lx,rx);
            return;
        }
        ll mid=(lx+rx)/2;
        Add(l,r,val,2*x,lx,mid);
        Add(l,r,val,2*x+1,mid+1,rx);
    }
    element Calc(ll pos,ll x,ll lx,ll rx)
    {
        Propagate(x,lx,rx);
        if (lx==rx)
            return st[x];
        ll mid=(lx+rx)/2;
        if (pos<=mid)
            return Calc(pos,2*x,lx,mid);
        return Calc(pos,2*x+1,mid+1,rx);
    }
};
seg_tree S;
void buildWall(ll n,ll k,ll op[],ll left[],ll right[],ll height[],ll finalHeight[])
{
    S.Init(n);
    for (ll i=0;i<k;i++)
        S.Add(left[i]+1,right[i]+1,{op[i],height[i]},1,1,s);
    for (ll i=0;i<n;i++)
        finalHeight[i]=max(0,S.Calc(i+1,1,1,s).minn);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...