Cod sursa(job #1979918)

Utilizator alexilasiAlex Ilasi alexilasi Data 11 mai 2017 17:55:34
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.96 kb
#include <bits/stdc++.h>

using namespace std;

#define dim 100000

ifstream fin("hotel.in");
ofstream fout("hotel.out");

int n,q,c,a,b;

struct nod_arbore
{
    int st,dr,best;
}v[4*dim+100];

void atribuie(nod_arbore &a,int val)
{
    a.st=a.dr=a.best=val;
}

void build_arb(int nod,int left,int right)
{
    if(left==right)
    {
        atribuie(v[nod],1);
        return ;
    }

    int mid=(left+right)/2;

    build_arb(nod*2,left,mid);
    build_arb(nod*2+1,mid+1,right);

    atribuie(v[nod],right-left+1);
}

void update_arb(int nod,int left,int right,int st,int dr,int caz)
{
    if(dr<left||st>right||left>right)
        return;
    if(st<=left&&right<=dr)
    {
        if(caz==1)
            atribuie(v[nod],0);
        else
            atribuie(v[nod],right-left+1);
        return;
    }

    int mij=(left+right)/2;

    if(v[nod].best==0)
    {
        atribuie(v[nod*2],0);
        atribuie(v[nod*2+1],0);
    }
    if(v[nod].best==right-left+1)
    {
        atribuie(v[nod*2],mij-left+1);
        atribuie(v[nod*2+1],right-mij);
    }

    update_arb(2*nod,left,mij,st,dr,caz);
    update_arb(2*nod+1,mij+1,right,st,dr,caz);

    v[nod].best=max(v[nod*2].best,v[nod*2+1].best);
    v[nod].best=max(v[nod].best,v[nod*2].dr+v[nod*2+1].st);

    v[nod].st=v[nod*2].st;

    if(v[nod*2].st==mij-left+1)
    {
        v[nod].st+=v[nod*2+1].st;
    }

    v[nod].dr=v[nod*2+1].dr;

    if(v[nod*2+1].dr==right-mij)
    {
        v[nod].dr+=v[nod*2].dr;
    }
}

int main()
{
    fin>>n>>q;
    build_arb(1,1,n);
    for(int i=1;i<=q;i++)
    {
        fin>>c;
        if(c==3)
            fout<<v[1].best<<'\n';
        else if(c==1)
        {
            fin>>a>>b;
            b+=a-1;
            update_arb(1,1,n,a,b,c);
        }
        else if(c==2)
        {
            fin>>a>>b;
            b+=a-1;
            update_arb(1,1,n,a,b,c);
        }
    }
    return 0;
}