Cod sursa(job #2572225)

Utilizator LazarRazvanLazar Razvan LazarRazvan Data 5 martie 2020 12:10:45
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.72 kb
/*
#include <iostream>
#include <fstream>

#define NUM 100005

struct vertex
{
    int state, ll, lr, lmax;
};

vertex tree[4 * NUM];
int n, p, c;

using namespace std;

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

void build(int pos, int tl, int tr)
{
    if(tl == tr)
    {
        tree[pos].ll = tree[pos].lr = tree[pos].lmax = 1;
        return;
    }

    int tm = tl + ((tr - tl) >> 1);

    build((pos << 1), tl, tm);
    build((pos << 1) + 1, tm + 1, tr);
    tree[pos].ll = tree[pos].lr = tree[pos].lmax = tr - tl + 1;
}

void update(int pos, int tl, int tr, int l, int r)
{
    if(tree[pos].state == 1)
    {
        tree[pos].ll = tree[pos].lr = tree[pos].lmax = 0;
        if(tl != tr)
            tree[(pos << 1)].state = tree[(pos << 1) + 1].state = 1;
        tree[pos].state = -1;
    }
    else if(tree[pos].state == 0)
    {
        tree[pos].ll = tree[pos].lr = tree[pos].lmax = tr - tl + 1;
        if(tl != tr)
            tree[(pos << 1)].state = tree[(pos << 1) + 1].state = 0;
        tree[pos].state = -1;
    }

    if(tl > r || tr < l)
        return;
    if(l <= tl && tr <= r)
    {
        if(c == 1)      //new tourists
        {
            tree[pos].ll = tree[pos].lr = tree[pos].lmax = 0;
            if(tl != tr) {
                tree[(pos << 1)].state = tree[(pos << 1) + 1].state = 1;
            }
        }
        else {
            tree[pos].ll = tree[pos].lr = tree[pos].lmax = tr - tl + 1;
            if (tl != tr) {
                tree[(pos << 1)].state = tree[(pos << 1) + 1].state = 0;
            }
        }
        return;
    }

    int tm = tl + ((tr - tl) >> 1);

    update((pos << 1), tl, tm, l, r);
    update((pos << 1) + 1, tm + 1, tr, l, r);

    tree[pos].lmax = max(tree[(pos << 1)].lmax, max(tree[(pos << 1) + 1].lmax, tree[(pos << 1)].lr + tree[(pos << 1) + 1].lr));
    tree[pos].ll = (tree[(pos << 1)].lmax == tm - tl + 1) ?
            tree[(pos << 1)].lmax + tree[(pos << 1) + 1].ll :
            tree[(pos << 1)].ll;
    tree[pos].lr = (tree[(pos << 1) + 1].lmax == tr - tm) ?
            tree[(pos << 1) + 1].lmax + tree[(pos << 1)].lr :
            tree[(pos << 1) + 1].lr;
}

int main()
{
    fin >> n >> p;
    build(1, 1, n);
    for(int i = 0; i < p; ++i)
    {
        fin >> c;
        if(c == 3)
            fout << tree[1].lmax << '\n';
        else
        {
            int l, nr;
            fin >> l >> nr;

            update(1, 1, n, l, l+nr-1);
        }
    }
    fin.close();
    fout.close();
}*/

#include <bits/stdc++.h>
#define NUM 100005
struct vertex
{
    int state, ll, lr, lmax;
};
vertex tree[4 * NUM];
int n, p, c, S, D;
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");

void build(int pos, int tl, int tr)
{
    if(tl == tr)
    {
        tree[pos].ll = tree[pos].lr = tree[pos].lmax = 1;
        return;
    }

    int tm = tl + ((tr - tl) >> 1);

    build((pos << 1), tl, tm);
    build((pos << 1) + 1, tm + 1, tr);
    tree[pos].ll = tree[pos].lr = tree[pos].lmax = tr - tl + 1;
}

void update(int pos, int tl, int tr)
{
    if(tree[pos].state == 1)
    {
        tree[pos].ll = tree[pos].lr = tree[pos].lmax = 0;
        if(tl != tr)
            tree[(pos << 1)].state = tree[(pos << 1) + 1].state = 1;
        tree[pos].state = -1;
    }
    else if(tree[pos].state == 0)
    {
        tree[pos].ll = tree[pos].lr = tree[pos].lmax = tr - tl + 1;
        if(tl != tr)
            tree[(pos << 1)].state = tree[(pos << 1) + 1].state = 0;
        tree[pos].state = -1;
    }

    if(tl > D || tr < S)
        return;
    if(S <= tl && tr <= D)
    {
        if(c == 1)
        {
            tree[pos].ll = tree[pos].lr = tree[pos].lmax = 0;
            if(tl != tr)
                tree[(pos << 1)].state = tree[(pos << 1) + 1].state = 1;
        }
        else
        {
            tree[pos].ll = tree[pos].lr = tree[pos].lmax = tr - tl + 1;
            if(tl != tr)
                tree[(pos << 1)].state = tree[(pos << 1) + 1].state = 0;
        }
        return;
    }

    int tm = tl + ((tr - tl) >> 1);

    update((pos << 1), tl, tm);
    update((pos << 1) + 1, tm + 1, tr);

    tree[pos].lmax = max(tree[(pos << 1)].lmax, max(tree[(pos << 1) + 1].lmax, tree[(pos << 1)].lr + tree[(pos << 1) + 1].ll));
    tree[pos].ll = (tree[(pos << 1)].lmax == tm - tl + 1) ? tree[(pos << 1)].lmax + tree[(pos << 1) + 1].ll : tree[(pos << 1)].ll;
    tree[pos].lr = (tree[(pos << 1) + 1].lmax == tr - tm) ? tree[(pos << 1) + 1].lmax + tree[(pos << 1)].lr : tree[(pos << 1) + 1].lr;
}

int main()
{
    f >> n >> p;
    build(1, 1, n);
    for(int i = 0; i < p; ++i)
    {
        f >> c;
        if(c == 3)
            g << tree[1].lmax << '\n';
        else
        {
            f >> S >> D;
            D = S + D - 1;
            update(1, 1, n);
        }
    }
    f.close();
    g.close();
}