Cod sursa(job #2005200)

Utilizator dragos231456Neghina Dragos dragos231456 Data 26 iulie 2017 14:53:53
Problema Hotel Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.43 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
struct {
    int slt,srt,smax,len;
}arb[400005];
int n,m,op,x,y;

void build(int nod,int lt,int rt,int pos)
{
    if(lt==rt)
    {
        arb[nod].smax=arb[nod].slt=arb[nod].srt=arb[nod].len=1;
        return;
    }
    int md=(lt+rt)/2;
    if(pos<=md) build(nod*2,lt,md,pos);
    else build(nod*2+1,md+1,rt,pos);

    arb[nod].len=arb[nod*2].len+arb[nod*2+1].len;
    arb[nod].smax=arb[nod].slt=arb[nod].srt=arb[nod].len;
}

void update(int nod,int lt,int rt,int x,int y,int s)
{
    if(arb[nod].smax!=max(arb[nod*2].smax,max(arb[nod*2+1].smax,arb[nod*2].srt+arb[nod*2+1].slt)))
    {
        if(arb[nod].smax)
        {
            arb[nod*2].smax=arb[nod*2].srt=arb[nod*2].slt=arb[nod*2].len;
            arb[nod*2+1].smax=arb[nod*2+1].srt=arb[nod*2+1].slt=arb[nod*2+1].len;
        }
        else
        {
            arb[nod*2].smax=arb[nod*2].srt=arb[nod*2].slt=arb[nod*2+1].smax=arb[nod*2+1].srt=arb[nod*2+1].slt=0;
        }
    }
    if(lt>y || rt<x) return;
    if(x<=lt && rt<=y)
    {
        if(s==2)
        {
            arb[nod].smax=arb[nod].slt=arb[nod].srt=arb[nod].len;
        }
        else
        {
            arb[nod].smax=arb[nod].slt=arb[nod].srt=0;
        }
        return;
    }
    if(lt==rt) return;
    int md=(lt+rt)/2;
    if(md>=x) update(nod*2,lt,md,x,y,s);
    if(md<y) update(nod*2+1,md+1,rt,x,y,s);

    arb[nod].len=arb[nod*2].len+arb[nod*2+1].len;
    arb[nod].smax=max(arb[nod*2].smax,max(arb[nod*2+1].smax,arb[nod*2].srt+arb[nod*2+1].slt));
    if(arb[nod*2].smax==arb[nod*2].len) arb[nod].slt=arb[nod*2].smax+arb[nod*2+1].slt;
    else arb[nod].slt=arb[nod*2].slt;
    if(arb[nod*2+1].smax==arb[nod*2+1].len) arb[nod].srt=arb[nod*2+1].smax+arb[nod*2].srt;
    else arb[nod].srt=arb[nod*2+1].srt;
}

void afisare()
{
    int d=0;
    for(int i=1;i<=5;++i)
    {
        for(int j=1;j<=(1<<(i-1));++j)
        {
            ++d;
            cout<<arb[d].smax<<' ';
        }
        cout<<endl;
    }
}

int main()
{
    f>>n>>m;
    for(int i=1;i<=n;++i) build(1,1,n,i);
    //afisare();
    for(int i=1;i<=m;++i)
    {
        f>>op;
        if(op==3) g<<arb[1].smax<<'\n';
        else
        {
            f>>x>>y;
            y=x+y-1;
            update(1,1,n,x,y,op);
            //afisare();
        }
    }
    return 0;
}