제출 #1137122

#제출 시각아이디문제언어결과실행 시간메모리
1137122LeonidCuk벽 (IOI14_wall)C++20
0 / 100
3096 ms197212 KiB
#include <bits/stdc++.h>
using namespace std;
vector<pair<int,int>>lazy[8000001];
vector<int>v;
void smeni(int i,int k1)
{
    for(int j=0;j<lazy[i].size();j++)
    {
        if(lazy[i][j].first==1)v[k1]=max(v[k1],lazy[i][j].second);
        else v[k1]=min(v[k1],lazy[i][j].second);
    }
}
void add(int i,int i1)
{
    for(int j=0;j<lazy[i].size();j++)
    {
        auto p=lazy[i][j];
        if(lazy[i1].size()==0)lazy[i1].push_back(p);
        else if(lazy[i1].size()==1)
        {
            if(lazy[i1][0].first!=p.first)lazy[i1].push_back(p);
            else if(lazy[i1][0].first==1)lazy[i1][0].second=max(lazy[i1][0].second,p.second);
            else lazy[i1][0].second=min(lazy[i1][0].second,p.second);
        }
        else
        {
            if(lazy[i1][1].first==p.first)
            {
                if(lazy[i1][1].first==1)lazy[i1][1].second=max(lazy[i1][1].second,p.second);
                else lazy[i1][1].second=min(lazy[i1][1].second,p.second);
            }
            else
            {
                if(lazy[i1][0].second>p.second&&p.first==2)
                {
                    lazy[i1][0].second=p.second;
                    swap(lazy[i1][0],lazy[i1][1]);
                }
                else if(lazy[i1][0].second<p.second&&p.first==1)
                {
                    lazy[i1][0].second=p.second;
                    swap(lazy[i1][0],lazy[i1][1]);
                }
            }
        }
        if(lazy[i1].size()==2)
        {
            if(lazy[i1][0].second>lazy[i1][1].second&&lazy[i1][0].first==1)lazy[i1][0].second=lazy[i1][1].second;
            else if(lazy[i1][0].second<lazy[i1][1].second&&lazy[i1][0].first==2)lazy[i1][0].second=lazy[i1][1].second;
        }
    }
}
void update(int i,int l,int r,int tl,int tr,int k,int k1)
{
    if(l>r||tl>r||l>tr)
    {
        return;
    }
    if(!lazy[i].empty())
    {
        if(l==r)
        {
            smeni(i,l);
        }
        else
        {
            add(i,i*2);
            add(i,i*2+1);
            lazy[i].clear();
        }
    }
    if(tl<=l&&r<=tr)
    {
        lazy[i].push_back({k,k1});
        return;
    }
    int m=(l+r)/2;
    update(i*2,l,m,tl,tr,k,k1);
    update(i*2+1,m+1,r,tl,tr,k,k1);
}
void najdi(int i,int l,int r)
{
    if(!lazy[i].empty())
    {
        if(l==r)
        {
            smeni(i,l);
        }
        else
        {
            add(i,i*2);
            add(i,i*2+1);
            lazy[i].clear();
        }
    }
    if(l==r)return;
    int m=(l+r)/2;
    najdi(i*2,l,m);
    najdi(i*2+1,m+1,r);
}
void buildWall(int n, int m, int op[], int left[], int right[],int height[], int finalHeight[])
{
    v.resize(n);
    int a,b,c,d;
    for(int i=0;i<m;i++)
    {
        a=op[i];
        b=left[i];
        c=right[i];
        d=height[i];
        update(1,0,n-1,b,c,a,d);
    }
    najdi(1,0,n-1);
    for(int i=0;i<n;i++)finalHeight[i]=v[i];
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...