Cod sursa(job #2332921)

Utilizator NaritaandreiCNAINarita Andrei NaritaandreiCNAI Data 31 ianuarie 2019 13:33:43
Problema Hotel Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.31 kb
#include <iostream>
#include <stdio.h>
#include <cstring>
#include <algorithm>
#include <vector>
using namespace std;
FILE *f,*g;
struct arbint
{
    int down, sol, lf, rt;
}v[300002];
int a,b,n,m,val;
void read()
{
    fscanf(f,"%d %d",&n,&m);
}
int maxim(int a, int b, int c)
{
    if(a>b)
        return a>c ? a:c;
    else
        return b>c ? b:c;
}
void update(int node, int st, int dr)
{
    if(st>=a && dr<=b)
    {
        if(val==1)
            v[node].lf=v[node].rt=v[node].sol=0;
        else
            v[node].lf=v[node].rt=v[node].sol=dr-st+1;
        v[node].down=1;
        return;
    }
    int mij=(st+dr)/2;
    if(v[node].down==1)
    {
        if(v[node].sol==0)
        {
            v[2*node].sol=v[2*node].lf=v[2*node].rt=0;
            v[2*node+1].sol=v[2*node+1].lf=v[2*node+1].rt=0;
        }
        else
        {
            v[2*node].sol=v[2*node].lf=v[2*node].rt=mij-st+1;
            v[2*node+1].sol=v[2*node+1].lf=v[2*node+1].rt=dr=mij;
        }
        v[2*node].down=v[2*node+1].down=1;
        v[node].down=0;
    }
    if(a<=mij)
        update(2*node, st, mij);
    if(b>mij)
        update(2*node+1, mij+1, dr);
    v[node].sol=maxim(v[2*node].sol, v[2*node+1].sol, v[2*node].rt+v[2*node+1].lf);

    if(v[2*node].lf==mij-st+1)
        v[node].lf=v[2*node].lf+v[2*node+1].lf;
    else
        v[node].lf=v[2*node].lf;

    if(v[2*node+1].rt==dr-mij)
        v[node].rt=v[2*node].rt+v[2*node+1].rt;
    else
        v[node].rt=v[2*node+1].rt;
}
void actual(int node, int st, int dr)
{
    if(node>3*n)
        return;
    v[node].sol=v[node].lf=v[node].rt=dr-st+1;
    int mij=(st+dr)/2;
    actual(2*node, st, mij);
    actual(2*node+1,mij+1, dr);
}
void solve()
{
    actual(1,1,n);
    for(int i=1; i<=m; i++)
    {
        fscanf(f,"%d",&val);
        if(val==1)
        {
            fscanf(f,"%d %d",&a,&b);
            b=a+b-1;
            update(1,1,n);
        }
        else if(val==2)
        {
            fscanf(f,"%d %d",&a,&b);
            b=a+b-1;
            update(1,1,n);
        }
        else
            fprintf(g,"%d\n",v[1].sol);
    }
}
int main()
{
    f=fopen("hotel.in","r");
    g=fopen("hotel.out","w");
    read();
    solve();
    //write();
    fclose(f);
    fclose(g);
    return 0;
}