Cod sursa(job #3165220)

Utilizator Theo20067Cismaru Theodor-Alexe Theo20067 Data 5 noiembrie 2023 17:57:48
Problema Hotel Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.28 kb
#include <fstream>
using namespace std;
ifstream fin ("hotel.in");
ofstream fout("hotel.out");
int n,V[100001],m,t,x,y,i;
struct nod
{
    int x,s,d,l,ok;
}A[400001];
void build(int nod,int st,int dr)
{
    if(st==dr)
    {
        A[nod].x=V[st];
        A[nod].ok=0;
        A[nod].s=A[nod].d=A[nod].l=1;
    }
    else
        if(st<dr)
        {
            int mid=(st+dr)/2;
            build(2*nod,st,mid);
            build(2*nod+1,mid+1,dr);
            A[nod].x=min(A[2*nod].x,A[2*nod+1].x);
            A[nod].ok=0;
            A[nod].s=A[nod].d=A[nod].l=dr-st+1;
        }
}
void update(int nod,int st,int dr,int a,int b,int x)
{
    if(a<=st&&dr<=b)
    {
        A[nod].x=x;
        A[nod].ok=x;
        if(x==0)
            A[nod].s=A[nod].d=A[nod].l=dr-st+1;
        else
            A[nod].s=A[nod].d=A[nod].l=0;
    }
    else
    {
        int mid=(st+dr)/2;
        if(A[nod].ok)
        {
            A[2*nod].ok=A[2*nod+1].ok=A[nod].ok;
            A[2*nod].x=A[nod].x;
            A[2*nod+1].x=A[nod].x;
            if(A[nod].ok==1)
            {
                A[2*nod].s=A[2*nod].d=A[2*nod].l=0;
                A[2*nod+1].s=A[2*nod+1].d=A[2*nod+1].l=0;
            }
            else
            {
                A[2*nod].s=A[2*nod].d=A[2*nod].l=mid-st+1;
                A[2*nod+1].s=A[2*nod+1].d=A[2*nod+1].l=dr-mid;
            }
            A[nod].ok=0;
        }
        if(a<=mid)
            update(2*nod,st,mid,a,b,x);
        if(b>=mid+1)
            update(2*nod+1,mid+1,dr,a,b,x);
        A[nod].x=min(A[2*nod].x,A[2*nod+1].x);
        A[nod].l=max(A[2*nod].d+A[2*nod+1].s,max(A[2*nod].l,A[2*nod+1].l));
        A[nod].s=A[2*nod].s;
        if(A[2*nod].s==mid-st+1)
            A[nod].s+=A[2*nod+1].s;
        A[nod].d=A[2*nod+1].d;
        if(A[2*nod+1].d==dr-mid)
            A[nod].d+=A[2*nod].d;
    }
}
int main()
{
    fin>>n>>m;
    build(1,1,n);
    for(i=1;i<=m;i++)
    {
        fin>>t;
        if(t==1)
        {
            fin>>x>>y;
            update(1,1,n,x,x+y-1,1);
        }
        else
            if(t==2)
            {
                fin>>x>>y;
                update(1,1,n,x,x+y-1,0);
            }
            else
                fout<<A[1].l<<"\n";
    }
    return 0;
}