Cod sursa(job #2510109)

Utilizator mihaela.macarie01@yahoo.comMihaela Macarie [email protected] Data 15 decembrie 2019 20:00:47
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.79 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream x("hotel.in");
ofstream y("hotel.out");

int a,b,n,m,val,i;

struct elem
{
    int st,dr,sol,t;
}v[4*100002+200];

void update(int nod, int left, int right)
{
    if(left>=a && right<=b)
    {
        if(val==1)
            v[nod].st=v[nod].dr=v[nod].sol=0;
        else
            v[nod].st=v[nod].dr=v[nod].sol=right-left+1;
        v[nod].t=1;
        return;
    }
    int mij=(left+right)/2;
    if(v[nod].t==1)
    {
        if(v[nod].sol==0)
        {
            v[2*nod].sol=v[2*nod].st=v[2*nod].dr=0;
            v[2*nod+1].sol=v[2*nod+1].st=v[2*nod+1].dr=0;
        }
        else
        {
            v[2*nod].sol=v[2*nod].st=v[2*nod].dr=mij-left+1;
            v[2*nod+1].sol=v[2*nod+1].st=v[2*nod+1].dr=right-mij;
        }
        v[2*nod].t=v[2*nod+1].t=1;
        v[nod].t=0;
    }

    if(a<=mij)
        update(2*nod,left,mij);
    if(b>mij)
        update(nod*2+1,mij+1,right);
    v[nod].sol=max(max(v[2*nod].sol,v[2*nod+1].sol),v[2*nod].dr+v[2*nod+1].st);

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

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

int main()
{
    x>>n>>m;
    a=1;
    b=n;
    val=2;
    update(1,1,n);
    for(i=1;i<=m;i++)
    {
        x>>val;
        if(val==1)
        {
            x>>a>>b;
            b=a+b-1;
            update(1,1,n);
        }
        else
        {
            if(val==2)
            {
                x>>a>>b;
                b=a+b-1;
                update(1,1,n);
            }
            else
                y<<v[1].sol<<'\n';
        }
    }
    x.close();
    y.close();
    return 0;
}