Cod sursa(job #2239106)

Utilizator TheNextGenerationAyy LMAO TheNextGeneration Data 9 septembrie 2018 11:41:44
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.46 kb
#include <bits/stdc++.h>

using namespace std;

ifstream in("hotel.in");
ofstream out("hotel.out");

const int NMAX = 1e5+1;
struct arb
{
    int Left,Right,Best,Lazy;
} tree[4*NMAX];
int x,y,type;

void value(int node, int st, int dr)
{
    int mj = (st+dr)/2;
    tree[node].Best = max(max(tree[2*node].Best,tree[2*node+1].Best),tree[2*node].Right+tree[2*node+1].Left);
    tree[node].Left = tree[2*node].Left+tree[2*node+1].Left*(tree[2*node].Left == mj-st+1);
    tree[node].Right = tree[2*node+1].Right+tree[2*node].Right*(tree[2*node+1].Right == dr-mj);
}

void build(int node, int st, int dr)
{
    if (st == dr)
        tree[node].Left = tree[node].Right = tree[node].Best = 1;
    else
    {
        int mj = (st+dr)/2;
        build(2*node,st,mj);
        build(2*node+1,mj+1,dr);
        value(node,st,dr);
    }
}

void propagate(int node, int st, int dr)
{
    if (!tree[node].Lazy || st == dr)
        return;
    int mj = (st+dr)/2;
    if (tree[node].Lazy == 1)
    {
        tree[2*node].Left = tree[2*node].Right = tree[2*node].Best = 0;
        tree[2*node+1].Left = tree[2*node+1].Right = tree[2*node+1].Best = 0;
    }
    else if (tree[node].Lazy == 2)
    {
        tree[2*node].Left = tree[2*node].Right = tree[2*node].Best = mj-st+1;
        tree[2*node+1].Left = tree[2*node+1].Right = tree[2*node+1].Best = dr-mj;
    }
    tree[2*node].Lazy = tree[2*node+1].Lazy = tree[node].Lazy;
    tree[node].Lazy = 0;
}

void update(int node, int st, int dr)
{
    propagate(node,st,dr);
    if (x<=st && dr<=y)
    {
        tree[node].Lazy = type;
        if (type == 1)
            tree[node].Left = tree[node].Right = tree[node].Best = 0;
        else
            tree[node].Left = tree[node].Right = tree[node].Best = dr-st+1;
    }
    else
    {
        int mj = (st+dr)/2;
        if (x<=mj)
            update(2*node,st,mj);
        if (mj<y)
            update(2*node+1,mj+1,dr);
        value(node,st,dr);
    }
}

int main()
{
    int n,m;
    in >> n >> m;
    build(1,1,n);
    for (int i = 1; i<=m; i++)
    {
        int t;
        in >> t;
        if (t == 1)
        {
            in >> x >> y;
            y = x+y-1;
            type = 1;
            update(1,1,n);
        }
        else if (t == 2)
        {
            in >> x >> y;
            y = x+y-1;
            type = 2;
            update(1,1,n);
        }
        else
            out << tree[1].Best << "\n";
    }
}