Cod sursa(job #1832671)

Utilizator delta_wolfAndrei Stoica delta_wolf Data 20 decembrie 2016 18:31:23
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.85 kb
#include <cstdio>
#include<algorithm>
using namespace std;
int n,p,type,start,finish;
struct rec{int left,right,best;}arb[400010];
void egal(int node,int x)
{
    arb[node].left=x;
    arb[node].right=x;
    arb[node].best=x;
}
void update(int node,int left,int right,int val)
{
    if(start<=left&&right<=finish)
    {
        if(val==1)
        egal(node,right-left+1);
        else
        egal(node,0);
        return ;
    }
    int mid=(left+right)/2;
    if(arb[node].best==0)
    {
        egal(2*node,0);
        egal(2*node+1,0);
    }
    if(arb[node].best==right-left+1)
    {
        egal(2*node,mid-left+1);
        egal(2*node+1,right-mid);
    }

    if(start<=mid)
    update(2*node,left,mid,val);

    if(mid<finish)
    update(2*node+1,mid+1,right,val);

    arb[node].best=max(arb[2*node].right+arb[2*node+1].left,max(arb[2*node].best,arb[2*node+1].best));

    if(arb[2*node].left==mid-left+1)
            arb[node].left=arb[node*2].left+arb[2*node+1].left;
    else arb[node].left=arb[2*node].left;

    if(arb[2*node+1].right==right-mid)
        arb[node].right=arb[2*node].right+arb[2*node+1].right;

    else arb[node].right=arb[2*node+1].right;
}


int main()
{
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    scanf("%d%d",&n,&p);
    for(int i=1;i<=n;i++)
    {
        start=finish=i;
        update(1,1,n,1);
    }
    for(;p;p--)
    {
        scanf("%d",&type);
        start=finish=0;
        if(type==1)
        {
            scanf("%d%d",&start,&finish);
            finish+=start-1;
            update(1,1,n,0);
        }
        else if(type==2)
        {
            scanf("%d%d",&start,&finish);
            finish+=start-1;
            update(1,1,n,1);
        }
        if(type==3)
            printf("%d\n",arb[1].best);
    }
    return 0;
}