Submission #697222

#TimeUsernameProblemLanguageResultExecution timeMemory
697222ToroTNWall (IOI14_wall)C++14
0 / 100
3089 ms45260 KiB
#include<bits/stdc++.h>
using namespace std;
#define X first 
#define Y second
#define mp make_pair
#include "wall.h"
pair<int,int> lz[8000005],seg[8000005];
int ans[2000005];
pair<int,int> merge(pair<int,int> lz1,pair<int,int> lz2)
{
    if(lz2.X>lz1.Y)return mp(lz2.X,lz2.X);
    if(lz2.Y<lz1.X)return mp(lz2.Y,lz2.Y);
    return mp(max(lz1.X,lz2.X),min(lz1.Y,lz2.Y));
}
void update(int tree,int st,int ed,int l,int r,int x,int y)
{
    int md=(st+ed)/2;
    //printf("st=%d md=%d ed=%d\n",st,md,ed);
    if(st>=l&&ed<=r)
    {
        lz[tree]=merge(lz[tree],mp(x,y));
    }
    if(st!=ed)
    {
        lz[2*tree]=merge(lz[2*tree],lz[tree]);
        lz[2*tree+1]=merge(lz[2*tree+1],lz[tree]);
    }
    //printf("before=%d %d\n",seg[tree].X,seg[tree].Y);
    seg[tree]=merge(seg[tree],lz[tree]);
    //printf("after=%d %d\n",seg[tree].X,seg[tree].Y);
    lz[tree].X=0,lz[tree].Y=1e9;
    if(st>r||ed<l)return;
    if(st>=l&&ed<=r)return;
    update(2*tree,st,md,l,r,x,y);
    update(2*tree+1,md+1,ed,l,r,x,y);
    seg[tree].X=min(seg[2*tree].X,seg[2*tree+1].X);
    seg[tree].Y=max(seg[2*tree].Y,seg[2*tree+1].Y);
}
pair<int,int> query(int tree,int st,int ed,int l,int r)
{
    int md=(st+ed)/2;
    if(st!=ed)
    {
        lz[2*tree]=merge(lz[2*tree],lz[tree]);
        lz[2*tree+1]=merge(lz[2*tree+1],lz[tree]);
    }
    seg[tree]=merge(seg[tree],lz[tree]);
    lz[tree].X=0,lz[tree].Y=1e9;
    if(st>r||ed<l)return mp(0,1e9);
    if(st>=l&&ed<=r)return seg[tree];
    pair<int,int> pi1,pi2;
    pi1=query(2*tree,st,md,l,r);
    pi2=query(2*tree+1,md+1,ed,l,r);
    return mp(max(pi1.X,pi2.X),min(pi1.Y,pi2.Y));
}
void buildWall(int n, int k, int op[], int left[], int right[], int height[], int finalHeight[])
{
    for(int i=0;i<=2000000;i++)lz[i].X=0,lz[i].Y=1e9,seg[i].X=0,seg[i].Y=0;
    for(int i=0;i<k;i++)
    {
        left[i]+=1,right[i]+=1;
        //printf("left=%d || right=%d\n",left[i],right[i]);
        if(op[i]==1)
        {
            update(1,1,n,left[i],right[i],height[i],1e9);
        }else
        {
            update(1,1,n,left[i],right[i],0,height[i]);
        }
        for(int j=1;j<=n;j++)
        {
            ans[j]=query(1,1,n,j,j).X;
            //printf("ans[%d]=%d\n",j,ans[j]);
        }
    }
    for(int i=1;i<=n;i++)
    {
        ans[i]=query(1,1,n,i,i).X;
        //printf("ans[%d]=%d\n",i,ans[i]);
    }
    for(int i=0;i<n;i++)finalHeight[i]=ans[i+1];
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...