Cod sursa(job #1827366)

Utilizator KronSabau Valeriu Kron Data 11 decembrie 2016 19:29:16
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <iostream>
#include <fstream>
#define Nmax 100010
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");

struct  elem
{
    int left,right,best;
}arb[4*Nmax];
int n,start,finish,maxim,x,y;
void egal(int nod,int x)
{
    arb[nod].left=x;
    arb[nod].right=x;
    arb[nod].best=x;
}


void update(int nod,int st,int dr,int val){
    //update pe intervalul [x,y]
    if(start<=st && dr<=finish){


        if(val==1){

            egal(nod,dr-st+1);}
        else{
            egal(nod,0);
        }

        return;
    }
    int mij=(st+dr)/2;

        if(arb[nod].best==0){
            egal(2*nod,0);
            egal(2*nod+1,0);
        }
        if(arb[nod].best==dr-st+1){
            egal(2*nod,mij-st+1);
            egal(2*nod+1,dr-mij);
        }

        if(start<=mij)
            update(2*nod,st,mij,val);
        if(mij<finish)
            update(2*nod+1,mij+1,dr,val);

        arb[nod].best=max(arb[2*nod].right+arb[2*nod+1].left ,max(arb[2*nod].best,arb[2*nod+1].best));

        if(arb[2*nod].left==mij-st+1)
            arb[nod].left=arb[2*nod].left+arb[2*nod+1].left;
        else arb[nod].left=arb[2*nod].left;


        if(arb[2*nod+1].right==dr-mij)
            arb[nod].right=arb[2*nod].right+arb[2*nod+1].right;
        else arb[nod].right=arb[2*nod+1].right;

}



int main()
{
    int m;
    f >> n >> m;
    for(int i=1;i<=n;i++)
    {
        start=i;
        finish=i;
        update(1,1,n,1);
    }
    int opt;
    for(int i=0;i<m;i++)
    {
        f >> opt;
        start=0;
        finish=0;
        if(opt==1)
        {
            f>> start >> finish;

            finish=start+finish-1;
            update(1,1,n,0);
        }
        if(opt==2)
        {
            f>> start >> finish ;
            finish=start+finish-1;
            update(1,1,n,1);
        }
        if(opt==3){
            g << arb[1].best << "\n";
        }
    }

    return 0;
}