Cod sursa(job #1656188)

Utilizator DenisONIcBanu Denis Andrei DenisONIc Data 18 martie 2016 21:27:52
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.11 kb
#include <fstream>
using namespace std;

ifstream f("hotel.in");
ofstream g("hotel.out");

long L[400005],n,i,j,p,t,pos,nr;

struct ab{
    long val,st,dr;
}v[400005];

void propagare(long nod,long st,long dr)
{
    long mij=(st+dr)/2;
    if (L[nod]==1)
    {
        L[nod]=0;
        L[nod*2+1]=L[nod*2]=1;
        v[nod*2+1].val=v[nod*2+1].st=v[nod*2+1].dr=dr-mij;
        v[nod*2].val=v[nod*2].st=v[nod*2].dr=mij-st+1;
    }
    else if (L[nod]==-1)
    {
        L[nod]=0;
        L[nod*2+1]=L[nod*2]=-1;
        v[nod*2+1].val=v[nod*2+1].st=v[nod*2+1].dr=0;
        v[nod*2].val=v[nod*2].st=v[nod*2].dr=0;
    }
}

ab update1(long nod,long st,long dr,long x,long y,long type)
{
    if (x<=st && dr<=y)
    {
        ab emp;
        if (type==1)
        {
            L[nod]=1;
            v[nod].val=dr-st+1;
            v[nod].st=v[nod].dr=dr-st+1;
            emp.val=emp.st=emp.dr=dr-st+1;
        }
        else
        {
            L[nod]=-1;
            v[nod].val=0;
            v[nod].st=v[nod].dr=0;
            emp.val=emp.st=emp.dr=0;
        }
        return emp;
    }
    else
    {
        ab r1,r2;
        long mij=(st+dr)/2,mx;
        propagare(nod,st,dr);
        r1=v[nod*2];
        r2=v[nod*2+1];
        if (x<=mij)
            r1=update1(nod*2,st,mij,x,y,type);
        if (mij+1<=y)
            r2=update1(nod*2+1,mij+1,dr,x,y,type);
        mx=max(r2.val,r1.val);
        ab emp;
        if (r2.st+r1.dr>mx)
            mx=r2.st+r1.dr;
        emp.val=mx;
        emp.st=r1.st;
        emp.dr=r2.dr;
        if (r1.val==mij-st+1)
            emp.st=r1.val+r2.st;
        if (r2.val==dr-mij)
            emp.dr=r1.dr+r2.val;
        v[nod]=emp;
        return emp;
    }
}

int main()
{
    f>>n>>p;
    update1(1,1,n,1,n,1);
    for (i=1;i<=p;i++)
    {
        f>>t;
        if (t==3)
            g<<v[1].val<<'\n';
        else
        {
            f>>pos>>nr;
            if (t==1)
                update1(1,1,n,pos,pos+nr-1,2);
            else
                update1(1,1,n,pos,pos+nr-1,1);
        }
    }

    return 0;
}