Cod sursa(job #2452629)

Utilizator stefanpiturStefan Alexandru Pitur stefanpitur Data 31 august 2019 15:56:24
Problema Hotel Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.91 kb
#include <iostream>
#include <cstdio>
using namespace std;
const int NMAX = 100001;
struct tree{
    int liber,st_liber,dr_liber,dim;
}arb[4 * NMAX];
int lf, rt;

void unite(tree &Res, tree f1, tree f2){
    if(f1.liber == f1.dim && f2.liber == f2.dim){
        Res.st_liber = Res.dr_liber = Res.liber = Res.dim = f1.dim + f2.dim;
        return;
    }

    Res.st_liber = f1.st_liber;
    if(f1.liber == f1.dim)    /// tot intervalul tinut de f1 este liber
        Res.st_liber = f1.liber + f2.st_liber;

    Res.dr_liber = f2.dr_liber;
    if(f2.liber == f2.dim)    /// tot intervalul tinut de f2 este liber
        Res.dr_liber =f1.dr_liber + f2.liber;

    Res.liber = max(max(f1.liber, f2.liber), f1.dr_liber + f2.st_liber);
    Res.dim = f1.dim + f2.dim;
}

void build(int nod, int st, int dr){
    if(st == dr){
        arb[nod].liber = arb[nod].st_liber = arb[nod].dr_liber = arb[nod].dim = 1;
        return;
    }
    int mij = (st+dr)/2;
    build(2*nod, st, mij);
    build(2*nod + 1, mij + 1, dr);
    unite(arb[nod], arb[2*nod], arb[2*nod + 1]);
}

void ocupa_camere(int nod, int st, int dr){
    //printf("ocupa :   %d %d\n",st,dr);
    if(dr < lf || st > rt)
        return;
    if(lf <= st && dr <= rt){
        //printf("ocupa :   inside ->>> %d %d\n",st,dr);
        arb[nod].liber = arb[nod].st_liber = arb[nod].dr_liber = 0;
    }
    if(st == dr){
        arb[nod].liber = arb[nod].st_liber = arb[nod].dr_liber = 0;
        return;
    }

    int mij = (st+dr)/2;
    ocupa_camere(2*nod, st, mij);
    ocupa_camere(2*nod + 1, mij + 1, dr);
    unite(arb[nod],arb[2*nod],arb[2*nod + 1]);
}

void elibereaza_camere(int nod, int st, int dr){
    //printf("elibereaza :   %d %d\n",st,dr);
    if(dr < lf || st > rt)
        return;
    if(lf <= st && dr <= rt){
        //printf("elibereaza :   inside ->>> %d %d liber = %d\n",st,dr,dr-st+1);
        arb[nod].liber = arb[nod].st_liber = arb[nod].dr_liber = dr - st + 1;
    }
    if(st == dr){
        arb[nod].liber = arb[nod].st_liber = arb[nod].dr_liber = 1;
        return;
    }
    int mij = (st+dr)/2;
    elibereaza_camere(2*nod, st, mij);
    elibereaza_camere(2*nod + 1, mij + 1, dr);
    unite(arb[nod],arb[2*nod],arb[2*nod + 1]);
    //printf("st = %d    dr = %d   liber = %d\n",st,dr,arb[nod].liber);
}

int main()
{
    FILE *fin, *fout;
    int n,p,i,m,op;
    fin = fopen("hotel.in","r");
    fout = fopen("hotel.out","w");
    fscanf(fin,"%d %d",&n,&p);
    build(1,1,n);
    while(p--){
        fscanf(fin,"%d",&op);
        if(op == 3)
            fprintf(fout,"%d\n",arb[1].liber);
        else{
            fscanf(fin,"%d %d",&i,&m);
            lf = i, rt = i + m - 1;
            if(op == 1)
                ocupa_camere(1,1,n);
            else
                elibereaza_camere(1,1,n);
            //printf("DONE\n");
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}