Cod sursa(job #2313880)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 7 ianuarie 2019 16:17:06
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.01 kb
#include <cstdio>
#include <iostream>
#define DIMN 100001
using namespace std;
struct arbore {
    int sol,down,lc,rc;
};
arbore aint [4*DIMN];

void update (int nod,int st,int dr,int l,int r,int val){
    int mid;
    if (l<=st && dr<=r){
        if (val==1){ // se ocupa
            aint[nod].lc=aint[nod].rc=aint[nod].sol=0;
            aint[nod].down=1;
        }
        else { // se elibereaza
            aint[nod].lc=aint[nod].rc=aint[nod].sol=dr-st+1;
            aint[nod].down=1;
        }
        return;
    }
    mid=(st+dr)/2;
    if (aint[nod].down==1){
        if (aint[nod].sol==0){
            aint[2*nod].lc=aint[2*nod].rc=aint[2*nod].sol=0;
            aint[2*nod+1].lc=aint[2*nod+1].rc=aint[2*nod+1].sol=0;
        }
        else{
            aint[2*nod].lc=aint[2*nod].rc=aint[2*nod].sol=mid-st+1;
            aint[2*nod+1].lc=aint[2*nod+1].rc=aint[2*nod+1].sol=dr-(mid+1)+1;
        }
        aint[2*nod].down=aint[2*nod+1].down=1;
        aint[nod].down=0;
    }
    if (l<=mid)
        update (2*nod,st,mid,l,r,val);
    if (mid+1<=r)
        update (2*nod+1,mid+1,dr,l,r,val);
    aint[nod].sol=max(max(aint[2*nod].sol,aint[2*nod+1].sol),aint[2*nod].rc+aint[2*nod+1].lc);
    if (aint[2*nod].lc==mid-st+1)
        aint[nod].lc=aint[2*nod].lc+aint[2*nod+1].lc;
    else
        aint[nod].lc=aint[2*nod].lc;
    if (aint[2*nod+1].rc==dr-(mid+1)+1)
        aint[nod].rc=aint[2*nod+1].rc+aint[2*nod].rc;
    else
        aint[nod].rc=aint[2*nod+1].rc;
}

int main()
{
    FILE *fin=fopen ("hotel.in","r");
    FILE *fout=fopen ("hotel.out","w");
    int n,q,cer,p,m;
    fscanf (fin,"%d%d",&n,&q);
    update (1,1,n,1,n,0);
    for (;q;q--){
        fscanf (fin,"%d",&cer);
        if (cer==1){
            fscanf (fin,"%d%d",&p,&m);
            update (1,1,n,p,p+m-1,1);
        }
        else if (cer==2){
            fscanf (fin,"%d%d",&p,&m);
            update (1,1,n,p,p+m-1,0);
        }
        else fprintf (fout,"%d\n",aint[1].sol);
    }
    return 0;
}