Cod sursa(job #1205864)

Utilizator alecsandrualex cuturela alecsandru Data 8 iulie 2014 12:26:54
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.31 kb
#include<cstdio>
#include<algorithm>

using namespace std;

struct Mytype
{
    int sf,st,lmax,val;
};

Mytype h[262145];

void fill(int xq,int yq,int v,int p,int x,int y)
{
    //printf("> %d %d %d %d %d %d %d %d %d %d\n", xq, yq, v, p, x, y, h[p].lmax, h[p].st, h[p].sf, h[p].val);
    if(xq==x&&yq==y)
    {
        h[p].val=v;
        h[p].sf=v*(y-x+1);
        h[p].st=v*(y-x+1);
        h[p].lmax=v*(y-x+1);
    }
    else
    {
        int med=(x+y)/2;
        if(h[p].val!=2)
        {
            h[2*p].val=h[p].val;
            h[2*p].sf=h[p].val*(med-x+1);
            h[2*p].st=h[p].val*(med-x+1);
            h[2*p].lmax=h[p].val*(med-x+1);
            h[2*p+1].val=h[p].val;
            h[2*p+1].sf=h[p].val*(y-med);
            h[2*p+1].st=h[p].val*(y-med);
            h[2*p+1].lmax=h[p].val*(y-med);
        }
        if(yq<=med)
        {
            fill(xq,yq,v,2*p,x,med);
        }
        else if(xq>med)
        {
            fill(xq,yq,v,2*p+1,med+1,y);
        }
        else
        {
            fill(xq,med,v,2*p,x,med);
            fill(med+1,yq,v,2*p+1,med+1,y);
        }

        //CALCULARE:

        if(h[2*p].val==h[2*p+1].val)
        {
            h[p].val=h[2*p].val;
        }
        else
        {
            h[p].val=2;
        }

        h[p].lmax=max(h[2*p].sf+h[2*p+1].st,h[2*p].lmax);
        h[p].lmax=max(h[p].lmax,h[2*p+1].lmax);

        h[p].sf=h[2*p+1].sf;
        if(h[2*p+1].val==1)
            h[p].sf+=h[2*p].sf;

        h[p].st=h[2*p].st;
        if(h[2*p].val==1)
            h[p].st+=h[2*p+1].st;
    }
    //printf("< %d %d %d %d %d %d %d %d %d %d\n", xq, yq, v, p, x, y, h[p].lmax, h[p].st, h[p].sf, h[p].val);
}

int query()
{
    return h[1].lmax;
}

int main()
{
    int n,q,i,op,x,y;
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    scanf("%d%d",&n,&q);
    fill(1,n,1,1,1,n);
    for(i=1; i<=q; i++)
    {
        scanf("%d",&op);
        if(op==1)
        {
            scanf("%d%d",&x,&y);
            y=x+y-1;
            fill(x,y,0,1,1,n);
        }
        else if(op==2)
        {
            scanf("%d%d",&x,&y);
            y=x+y-1;
            fill(x,y,1,1,1,n);
        }
        else
        {
            printf("%d\n",query());
        }
    }
}