Cod sursa(job #2514455)

Utilizator hunting_dogIrimia Alex hunting_dog Data 25 decembrie 2019 20:54:45
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.76 kb
#include <fstream>
#include <iostream>
#define NMAX 1700000

using namespace std;

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

struct nod
{
    int nmax,pref,suf,val;
}a[NMAX];

void buildArb(int s,int d,int k)
{
    if(s==d)
    {
        a[k].nmax=a[k].pref=a[k].suf=d-s+1;
        return;
    }
    int m=(s+d)/2;
    buildArb(s,m,2*k);
    buildArb(m+1,d,2*k+1);
    a[k].nmax=a[k].pref=a[k].suf=d-s+1;
}

void update(int x,int y,int val,int s,int d,int k)
{
    if(a[k].val==1)
    {
        a[k].nmax=a[k].pref=a[k].suf=0;
        a[2*k].val=a[2*k+1].val=a[k].val;
        a[k].val=-1;
    }
    else
        if(a[k].val==0)
    {
            a[k].nmax=a[k].pref=a[k].suf=d-s+1;
            a[2*k].val=a[2*k+1].val=a[k].val;
            a[k].val=-1;
    }
    if(s>y || d<x)
        return;
    if(s>=x && d<=y)
    {
        if(val==0)
            a[k].nmax=a[k].pref=a[k].suf=d-s+1;
        else
            a[k].nmax=a[k].pref=a[k].suf=0;
        a[2*k].val=a[2*k+1].val=val;
        return;
    }
    int m=(s+d)/2;
    update(x,y,val,s,m,2*k);
    update(x,y,val,m+1,d,2*k+1);
    a[k].nmax=max(max(a[2*k].nmax,a[2*k+1].nmax),a[2*k].suf+a[2*k+1].pref);
    a[k].pref=(a[2*k].nmax==m-s+1)? a[2*k].nmax+a[2*k+1].pref:a[2*k].pref;
    a[k].suf=(a[2*k+1].nmax==d-m)? a[2*k+1].nmax+a[2*k].suf:a[2*k+1].suf;
}

int main()
{

    int n,m;
    fin>>n>>m;
    buildArb(1,n,1);
    while(m--)
    {
        int v;
        fin>>v;
        if(v==3)
            fout<<a[1].nmax<<'\n';
        else
        {
            int x,y;
            fin>>x>>y;
            if(v==1)
                update(x,x+y-1,1,1,n,1);
            else
                update(x,x+y-1,0,1,n,1);
        }
    }

    return 0;
}