Cod sursa(job #1654675)

Utilizator horiainfoTurcuman Horia horiainfo Data 17 martie 2016 12:44:59
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.81 kb
#include <fstream>
#include <cstdio>

#define NMAX 100001
using namespace std;
ofstream fout("hotel.out");

struct graf{int lastST, lastDR, bstSecv, lazzy; };

int bst, N4;
graf v[NMAX * 4];

void propagate(int st, int dr, int node)
{
    if(v[node].lazzy == -1)
        return;
    if(v[node].lazzy == 0)
    {
        v[node].lastST = dr; v[node].lastDR = st;
        v[node].bstSecv = dr - st + 1;
    }
    else
    {
        v[node].lastST = -1; v[node].lastDR = -1;
        v[node].bstSecv = 0;
    }
    if(node * 2 <= N4)  v[node * 2].lazzy = v[node].lazzy;
    if(node * 2 + 1 <= N4)  v[node * 2 + 1].lazzy = v[node].lazzy;

    v[node].lazzy = -1;
}

void update(int inc, int sf, int val, int st, int dr, int node)
{
    if(inc <= st && dr <= sf)
    {
        v[node].lazzy = val;
        propagate(st, dr, node);
        return;
    }

    int mij = (st + dr) / 2;

    propagate(st, mij, node * 2);
    propagate(mij + 1, dr, node * 2 + 1);

    if(inc <= mij)
        update(inc, sf, val, st, mij, node * 2);
    if(mij < sf)
        update(inc, sf, val, mij + 1, dr, node * 2 + 1);

    v[node].bstSecv = 0;

    if(v[node * 2].bstSecv > v[node].bstSecv)   v[node].bstSecv = v[node * 2].bstSecv;
    if(v[node * 2 + 1].bstSecv > v[node].bstSecv) v[node].bstSecv = v[node * 2 + 1].bstSecv;

    if(v[node * 2].lastDR != -1 && v[node * 2 + 1].lastST != -1)
        if(v[node * 2 + 1].lastST - v[node * 2].lastDR + 1 > v[node].bstSecv)
            v[node].bstSecv = v[node * 2 + 1].lastST - v[node * 2].lastDR + 1;

    if(v[node * 2].lastST == mij && v[node * 2 + 1].lastST != -1)
        v[node].lastST = v[node * 2 + 1].lastST;
    else
        v[node].lastST = v[node * 2].lastST;
    if(v[node * 2 + 1].lastDR == mij + 1 && v[node * 2].lastDR != -1)
        v[node].lastDR = v[node * 2].lastDR;
    else
        v[node].lastDR = v[node * 2 + 1].lastDR;
    return;
}

void firstBuild(int st, int dr, int node)
{
    v[node].lastST = dr; v[node].lastDR = st;
    v[node].lazzy = -1; v[node].bstSecv = dr - st + 1;
    if(st != dr)
    {
        int mij = (st + dr) / 2;
        if(st <= mij)
            firstBuild(st, mij, node * 2);
        if(dr > mij)
            firstBuild(mij +  1, dr, node * 2 + 1);
    }
}

int main()
{
    int tasks, n, c, inc, lg;

    freopen("hotel.in", "r", stdin);
    scanf("%d%d", &n, &tasks);

    N4 = n * 4;
    firstBuild(1, n, 1);

    for(int task = 1; task <= tasks; task++)
    {
        scanf("%d", &c);
        if(c <= 2)
        {
            scanf("%d%d", &inc, &lg);
            if(c == 1)
                update(inc, inc + lg - 1, 1, 1, n, 1);
            else
                update(inc, inc + lg - 1, 0, 1, n, 1);
        }
        else
            fout <<v[1].bstSecv <<'\n';
    }

    return 0;
}