Cod sursa(job #1483743)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 9 septembrie 2015 21:02:01
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <cstdio>
#define LMAX 400023
struct str
{
    int st;
    int dr;
    int best;
}arb[LMAX];
int n,m;
int maxim(int a,int b,int c)
{
    if(a>b)
    {
        if(a>c) return a;
        return c;
    }
    if(b>c) return b;
    return c;
}
void update(int s,int e,int p1,int p2,int nod,int caz)
{
    if(s==p1&&e==p2)
    {
        if(caz==0)
        {
            arb[nod].st=0;
            arb[nod].dr=0;
            arb[nod].best=0;
        }
        else if(caz==1)
        {
            arb[nod].st=p2-p1+1;
            arb[nod].dr=p2-p1+1;
            arb[nod].best=p2-p1+1;
        }
        return;
    }
    else
    {
        int mij=(s+e)/2;
        if(arb[nod].best==0)
        {
            arb[2*nod].best=0;arb[2*nod].st=0;arb[2*nod].dr=0;
            arb[2*nod+1].best=0;arb[2*nod+1].st=0;arb[2*nod+1].dr=0;
        }
        if(arb[nod].best==e-s+1)
        {
            arb[2*nod].best=mij-s+1;arb[2*nod].st=mij-s+1;arb[2*nod].dr=mij-s+1;
            arb[2*nod+1].best=e-mij;arb[2*nod+1].st=e-mij;arb[2*nod+1].dr=e-mij;
        }
        if(p2<=mij) update(s,mij,p1,p2,2*nod,caz);
        else if(p1>mij) update(mij+1,e,p1,p2,2*nod+1,caz);
        else
        {
            update(s,mij,p1,mij,2*nod,caz);
            update(mij+1,e,mij+1,p2,2*nod+1,caz);
        }
        if(arb[2*nod].st==mij-s+1) arb[nod].st=arb[2*nod].st+arb[2*nod+1].st;
        else arb[nod].st=arb[2*nod].st;
        if(arb[2*nod+1].dr==e-(mij+1)+1) arb[nod].dr=arb[2*nod].dr+arb[2*nod+1].dr;
        else arb[nod].dr=arb[2*nod+1].dr;
        arb[nod].best=maxim(arb[2*nod].best,arb[2*nod+1].best,arb[2*nod].dr+arb[2*nod+1].st);
    }
}
int main()
{
    freopen ("hotel.in","r",stdin);
    freopen ("hotel.out","w",stdout);
    scanf("%d%d",&n,&m);
    int caz,x,y;
    for(int i=1;i<=n;i++) update(1,n,i,i,1,1);
    for(int i=1;i<=m;i++)
    {
        scanf("%d",&caz);
        if(caz==1)
        {
            scanf("%d%d",&x,&y);
            update(1,n,x,x+y-1,1,0);
        }
        else if(caz==2)
        {
            scanf("%d%d",&x,&y);
            update(1,n,x,x+y-1,1,1);
        }
        else printf("%d\n",arb[1].best);
    }
}