Cod sursa(job #1403313)

Utilizator danalex97Dan H Alexandru danalex97 Data 27 martie 2015 10:47:52
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <iostream>
#include <fstream>
using namespace std;

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

const int N = 100010;

struct node {
    int l,r,mk,bst;
};

node a[N*4];

void update(int n,int l,int r,int il,int ir,int tp)
{
    if ( r < il || l > ir )
        return;
    if ( il <= l && r <= ir )
    {
        a[n].mk = tp;
        a[n].bst = a[n].l = a[n].r = tp == -1 ? 0 : r-l+1;
        return;
    }

    int m = (l + r) / 2;

    if ( a[n].mk != 0 )
    {
        a[n*2].mk = a[n*2+1].mk = a[n].mk;
        a[n*2].bst = a[n*2].l = a[n*2].r =  a[n].mk == -1 ? 0 : m-l+1;
        a[n*2+1].bst = a[n*2+1].l = a[n*2+1].r =  a[n].mk == -1 ? 0 : r-(m+1)+1;
        a[n].mk = 0;
    }

    update(n*2,l,m,il,ir,tp);
    update(n*2+1,m+1,r,il,ir,tp);

    a[n].l = a[n*2].l == m-l+1 ? a[n*2].l + a[n*2+1].l : a[n*2].l;
    a[n].r = a[n*2+1].r == r-(m+1)+1 ? a[n*2+1].r + a[n*2].r : a[n*2+1].r;
    a[n].bst = max(a[n*2].bst,a[n*2+1].bst);
    a[n].bst = max(a[n].bst,a[n*2].r+a[n*2+1].l);
}

int n,m;

int main()
{
    F>>n>>m;
    update(1,1,n,1,n,1);
    for (int i=1,tp,l,r;i<=m;++i)
    {
        F>>tp;
        if ( tp == 1 )
        {
            F>>l>>r;
            r += l-1;
            update(1,1,n,l,r,-1);
        }
        if ( tp == 2 )
        {
            F>>l>>r;
            r += l-1;
            update(1,1,n,l,r,1);
        }
        if ( tp == 3 )
        {
            G<<a[1].bst<<'\n';
        }
    }
}