Cod sursa(job #1811083)

Utilizator LucianTLucian Trepteanu LucianT Data 20 noiembrie 2016 20:38:34
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.03 kb
#include <bits/stdc++.h>
#define maxN 100005
using namespace std;
struct aint
{
    int bst,left,right;
}arb[4*maxN];
int n,m,i,j,op,x,y;
void build(int nod,int st,int dr)
{
    if(st==dr)
    {
        arb[nod].bst=arb[nod].left=arb[nod].right=1;
        return;
    }
    int mij=st+(dr-st)/2;
    build(2*nod,st,mij);
    build(2*nod+1,mij+1,dr);
    arb[nod].bst=arb[nod].left=arb[nod].right=arb[2*nod].bst+arb[2*nod+1].bst;
}
void update(int nod,int st,int dr)
{
    if(x<=st && dr<=y){
        if(op==1)
            arb[nod].bst=arb[nod].left=arb[nod].right=0;
        if(op==2) arb[nod].bst=arb[nod].left=arb[nod].right=dr-st+1;
        return;
    }
    if(st==dr)
        return;
    int mij=st+(dr-st)/2;
    if(arb[nod].bst==0)
        arb[2*nod].bst=arb[2*nod].left=arb[2*nod].right=0,
        arb[2*nod+1].bst=arb[2*nod+1].left=arb[2*nod+1].right=0;
    if(arb[nod].bst==dr-st+1)
        arb[2*nod].bst=arb[2*nod].left=arb[2*nod].right=mij-st+1,
        arb[2*nod+1].bst=arb[2*nod+1].left=arb[2*nod+1].right=dr-mij;
    if(x<=mij)
        update(2*nod,st,mij);
    if(mij<y)
        update(2*nod+1,mij+1,dr);
    arb[nod].bst=max(arb[2*nod].bst,max(arb[2*nod+1].bst,arb[2*nod].right+arb[2*nod+1].left));
    if(arb[2*nod].left==mij-st+1)
        arb[nod].left=arb[2*nod].left+arb[2*nod+1].left;
    else arb[nod].left=arb[2*nod].left;
    if(arb[2*nod+1].right==dr-mij)
        arb[nod].right=arb[2*nod].right+arb[2*nod+1].right;
    else arb[nod].right=arb[2*nod+1].right;
}
int main()
{
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    scanf("%d %d",&n,&m);
    build(1,1,n);
    while(m--)
    {
        scanf("%d",&op);
        if(op==1)
        {
            scanf("%d %d",&x,&y);
            y=x+y-1;
            update(1,1,n);
            continue;
        }
        if(op==2)
        {
            scanf("%d %d",&x,&y);
            y=x+y-1;
            update(1,1,n);
            continue;
        }
        printf("%d\n",arb[1].bst);
    }
    return 0;
}