Cod sursa(job #1112939)

Utilizator VisuianMihaiMihai Visuian VisuianMihai Data 20 februarie 2014 10:27:29
Problema Hotel Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include <fstream>

#define l first.first
#define r first.second
#define t second

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

typedef pair<pair<int,int>,int > Tree;
Tree arb[4*100001];
int n, m, op, x, y;

void Update(int nod, int st, int dr, int lq, int rq, int op)
{
    int m=(st+dr)/2;
    if(op==1)
    {
        if(lq<=st&&dr<=rq)
        {
            arb[nod].t=arb[nod].r=arb[nod].l=0;
            return;
        }
        if(arb[nod].t==dr-st+1)
        {
            arb[2*nod].t=arb[2*nod].l=arb[2*nod].r=m-st+1;
            arb[2*nod+1].t=arb[2*nod+1].l=arb[2*nod+1].r=dr-m;
        }
    }
    else if(op==2)
    {
        if(lq<=st&&dr<=rq)
        {
            arb[nod].t=arb[nod].r=arb[nod].l=dr-st+1;
            return;
        }
        if(arb[nod].t==0)
        {
            arb[2*nod].t=arb[2*nod].l=arb[2*nod].r=0;
            arb[2*nod+1].t=arb[2*nod+1].l=arb[2*nod+1].r=0;
        }
    }
    if(lq<=m)
        Update(2*nod,st,m,lq,rq,op);
    if(rq>m)
        Update(2*nod+1,m+1,dr,lq,rq,op);
    arb[nod].t=max(arb[2*nod].t,arb[2*nod+1].t);
    arb[nod].t=max(arb[2*nod].t,arb[2*nod].r+arb[2*nod+1].l);
    arb[nod].l=arb[2*nod].l;
    if(arb[2*nod].t==m-st+1)
        arb[nod].l=arb[2*nod].t+arb[2*nod+1].l;
    arb[nod].r=arb[2*nod+1].r;
    if(arb[2*nod+1].t==dr-m)
        arb[nod].r=arb[2*nod+1].t+arb[2*nod].r;
}

int main()
{
    fin>>n>>m;
    Update(1,1,n,1,n,2);
    for(int i = 1; i<= m; i++ )
    {
        fin>>op;
        if(op!=3)
        {
            fin>>x>>y;
            Update(1,1,n,x,y+x-1,op);
        }
        else
        {
            fout<<arb[1].t<<'\n';
        }

    }
    fin.close();
    fout.close();
    return 0;
}