Cod sursa(job #2139726)

Utilizator stelian2000Stelian Chichirim stelian2000 Data 22 februarie 2018 19:08:37
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <cstdio>
#include <algorithm>

using namespace std;

struct arbint
{
    int st,dr,sol,lazy;
}arb[400010];

void init(int nod,int st,int dr)
{
    arb[nod].st=arb[nod].dr=arb[nod].sol=dr-st+1;
    if(st==dr) return;
    int mid=(st+dr)/2;
    init(nod*2,st,mid);
    init(nod*2+1,mid+1,dr);
}

void propag(int nod,int st,int dr)
{
    if(arb[nod].lazy==0) return;
    if(arb[nod].lazy==2) arb[nod].st=arb[nod].dr=arb[nod].sol=dr-st+1;
    else if(arb[nod].lazy==1) arb[nod].st=arb[nod].dr=arb[nod].sol=0;
    if(st<dr) arb[nod*2].lazy=arb[nod*2+1].lazy=arb[nod].lazy;
    arb[nod].lazy=0;
}

void update(int nod,int st,int dr,int left,int right,int val)
{
    if(left<=st && dr<=right)
    {
        arb[nod].lazy=val;
        propag(nod,st,dr);
        return;
    }
    propag(nod,st,dr);
    int mid=(st+dr)/2;
    if(left<=mid) update(nod*2,st,mid,left,right,val);
    else propag(nod*2,st,mid);
    if(mid<right) update(nod*2+1,mid+1,dr,left,right,val);
    else propag(nod*2+1,mid+1,dr);
    arb[nod].sol=max(arb[nod*2].dr+arb[nod*2+1].st,max(arb[nod*2].sol,arb[nod*2+1].sol));
    arb[nod].st=arb[nod*2].st;
    if(arb[nod].st==mid-st+1) arb[nod].st+=arb[nod*2+1].st;
    arb[nod].dr=arb[nod*2+1].dr;
    if(arb[nod].dr==dr-mid) arb[nod].dr+=arb[nod*2].dr;
}

int main()
{
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    int n,q,tip,l,r;
    scanf("%d%d",&n,&q);
    init(1,1,n);
    for(int i=1;i<=q;i++)
    {
        scanf("%d",&tip);
        if(tip==3) {propag(1,1,n);printf("%d\n",arb[1].sol);continue;}
        scanf("%d%d",&l,&r);
        r+=l-1;
        update(1,1,n,l,r,tip);
    }
    return 0;
}