Cod sursa(job #2344458)

Utilizator dobrandreiAndrei Dobra dobrandrei Data 15 februarie 2019 09:34:15
Problema Hotel Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.97 kb
#include <stdio.h>
#include <iostream>
using namespace std;
FILE *in,*out;

int n,m,p,lf,rg,val;
struct name
{
    int gol,l,r,down;
} v[200002];

void read()
{
    fscanf(in,"%d %d",&n,&p);
}

void update(int node, int left,int right)
{
    if(left>=lf && right<=rg)
    {
        if(val==1)
            v[node].l=v[node].r=v[node].gol=0;
        else
            v[node].l=v[node].r=v[node].gol=right-left+1;
        v[node].down=1;
        return;
    }
    int mij=(left+right)/2;
    if(v[node].down==1)
    {
        if(v[node].gol==0)
        {
            v[2*node].gol=v[2*node].l=v[2*node].r=0;
            v[2*node+1].gol=v[2*node+1].l=v[2*node+1].r=0;
        }
        else
        {
            v[2*node].gol=v[2*node].l=v[2*node].r=mij-left+1;
            v[2*node+1].gol=v[2*node+1].l=v[2*node+1].r=right-mij;
        }
        v[2*node].down=v[2*node+1].down=1;
        v[node].down=0;
    }
    if(lf<=mij)
        update(2*node, left, mij);
    if(rg>mij)
        update(2*node+1, mij+1, right);
    v[node].gol=max(max(v[node*2].gol,v[node*2+1].gol),v[node*2].r+v[node*2+1].l);
    v[node].l=v[node*2].l;
    if(v[node*2].l==mij-left+1)
        v[node].l+=v[node*2+1].l;
    v[node].r=v[node*2+1].r;
    if(v[node*2+1].r==right-mij)
        v[node].r+=v[node*2].r;

}

void solve()
{
    lf=1;
    rg=n;
    val=2;
    update(1,1,n);
    int c;
    for(int i=1; i<=p; i++)
    {
        fscanf(in,"%d",&c);
        if(c==1)
        {
            fscanf(in,"%d %d",&lf,&rg);
            rg=lf+rg-1;
            val=1;
            update(1,1,n);
        }
        else if(c==2)
        {
            fscanf(in,"%d %d",&lf,&rg);
            rg=lf+rg-1;
            val=0;
            update(1,1,n);
        }
        else
        {
            fprintf(out,"%d\n",v[1].gol);
        }
    }
}

int main()
{
    in=fopen("hotel.in","r");
    out=fopen("hotel.out","w");
    read();
    solve();
    return 0;
}