Cod sursa(job #1478093)

Utilizator bogdan10bosBogdan Sitaru bogdan10bos Data 27 august 2015 19:30:40
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.45 kb
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <ctime>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <deque>

#define INF ( (1 << 30) - 1 + (1 << 30) )
#define mod 666013

using namespace std;

struct arbint
{
    int st;
    int dr;
    int scv;
    int lzy;
}aint[400005];

int n, m, x, y, op;

void B(int, int, int);
void U0(int, int, int, int, int);
void U1(int, int, int, int, int);
void uLzy(int, int, int, int);
arbint C(arbint, arbint, int, int, int);
int Q();

void B(int nod, int st, int dr)
{
    if(st == dr)
    {
        aint[nod].st = aint[nod].dr = aint[nod].scv = 1;
        aint[nod].lzy = -1;
        return;
    }

    int mij = st + ( (dr - st) >> 1 );

    B(nod << 1, st, mij);
    B((nod << 1) + 1, mij + 1, dr);

    aint[nod].lzy = -1;
    aint[nod].st = aint[nod].dr = aint[nod].scv = dr - st + 1;
}

void U0(int nod, int st, int dr, int sti, int dri)
{
    if(st == dr)
    {
        aint[nod].st = aint[nod].dr = aint[nod].scv = 0;
        return;
    }

    if(sti <= st && dr <= dri)
    {
        aint[nod].st = aint[nod].dr = aint[nod].scv = 0;
        aint[nod].lzy = 0;
        return;
    }

    int mij = st + ( (dr - st) >> 1 );

    uLzy(nod, st, mij, dr);

    if(sti <= mij)
        U0(nod * 2, st, mij, sti, dri);
    if(mij + 1 <= dri)
        U0(nod * 2 + 1, mij + 1, dr, sti, dri);

    aint[nod] = C(aint[nod * 2], aint[nod * 2 + 1], st, mij, dr);
}

void U1(int nod, int st, int dr, int sti, int dri)
{
    if(st == dr)
    {
        aint[nod].st = aint[nod].dr = aint[nod].scv = 1;
        return;
    }

    if(sti <= st && dr <= dri)
    {
        aint[nod].st = aint[nod].dr = aint[nod].scv = dr - st + 1;
        aint[nod].lzy = 1;
        return;
    }

    int mij = st + ( (dr - st) >> 1 );

    uLzy(nod, st, mij, dr);

    if(sti <= mij)
        U1(nod * 2, st, mij, sti, dri);
    if(mij + 1 <= dri)
        U1(nod * 2 + 1, mij + 1, dr, sti, dri);

    aint[nod] = C(aint[nod * 2], aint[nod * 2 + 1], st, mij, dr);
}

int Q()
{
    return aint[1].scv;
}

arbint C(arbint lft, arbint rgt, int st, int mij, int dr)
{
    arbint rez;

    rez.lzy = -1;

    rez.st = lft.st;
    if(rez.st == mij - st + 1)
        rez.st = lft.st + rgt.st;

    rez.dr = rgt.dr;
    if(rgt.dr == dr - mij)
        rez.dr = rgt.dr + lft.dr;

    rez.scv = max(rez.st, rez.dr);
    rez.scv = max(rez.scv, lft.dr + rgt.st);

    return rez;
}

void uLzy(int nod, int st, int mij, int dr)
{
    if(aint[nod].lzy == -1)
        return;
    if(aint[nod].lzy == 0)
    {
        aint[nod].lzy = -1;
        U0(nod * 2, st, mij, st, mij);
        U0(nod * 2 + 1, mij + 1, dr, mij + 1, dr);
        return;
    }
    if(aint[nod].lzy == 1)
    {
        aint[nod].lzy = -1;
        U1(nod * 2, st, mij, st, mij);
        U1(nod * 2 + 1, mij + 1, dr, mij + 1, dr);
        return;
    }
}

int main()
{
    freopen("hotel.in", "r", stdin);
    freopen("hotel.out", "w", stdout);

    scanf("%d%d", &n, &m);

    B(1, 1, n);

    while( m-- )
    {
        scanf("%d", &op);
        if(op == 1)
        {
            scanf("%d%d", &x, &y);
            U0(1, 1, n, x, x + y - 1);
        }
        else if(op == 2)
        {
            scanf("%d%d", &x, &y);
            U1(1, 1, n, x, x + y - 1);
        }
        else
            printf("%d\n", Q());
    }
    return 0;
}