Cod sursa(job #2004245)

Utilizator Mircea_DonciuDonciu Mircea Mircea_Donciu Data 25 iulie 2017 13:05:24
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.81 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)
{
    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;
}