Cod sursa(job #3297908)

Utilizator Tudor_11Tudor Ioan Calin Tudor_11 Data 24 mai 2025 12:36:45
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,unroll-loops")
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
struct aint
{
    int st,dr,mx;
};
int lazy[400001];
aint tree[400001];
void propagate(int node,int st,int dr)
{
    if(lazy[node]!=-1)
    {
        if(lazy[node])
        {
            tree[node]={0,0,0};
            if(st!=dr)
            {
                lazy[2*node]=1;
                lazy[2*node+1]=1;
            }
        }
        else
        {
            tree[node]={dr-st+1,dr-st+1,dr-st+1};
            if(st!=dr)
            {
                lazy[2*node]=0;
                lazy[2*node+1]=0;
            }
        }
    }
    lazy[node]=-1;
}
void update(int node,int st,int dr,int a,int b,int val)
{
    propagate(node,st,dr);
    if(st>b || dr<a) return;
    if(a<=st && dr<=b)
    {
        lazy[node]=val;
        propagate(node,st,dr);
        return;
    }
    else
    {
        int mid=(st+dr)/2;
        update(2*node,st,mid,a,b,val);
        update(2*node+1,mid+1,dr,a,b,val);
        if(tree[2*node].st==(mid-st+1))
        {
            tree[node].st=tree[2*node].st+tree[2*node+1].st;
        }
        else tree[node].st=tree[2*node].st;
        if(tree[2*node+1].dr==dr-mid)
        {
            tree[node].dr=tree[2*node].dr+tree[2*node+1].dr;
        }
        else tree[node].dr=tree[2*node+1].dr;
        tree[node].mx=max(max(tree[2*node].mx,tree[2*node+1].mx),tree[2*node].dr+tree[2*node+1].st);
    }
}
int main()
{
    int n,p,c,m,pos;
    fin>>n>>p;
    for(int i=1;i<=4*n;i++) lazy[i]=-1;
    update(1,1,n,1,n,0);
    for(int i=1;i<=p;i++)
    {
       fin>>c;
       if(c==1)
       {
           fin>>pos>>m;
           update(1,1,n,pos,pos+m-1,1);
       }
       else if(c==2)
       {
           fin>>pos>>m;
           update(1,1,n,pos,pos+m-1,0);
       }
       else
       {
           fout<<tree[1].mx<<'\n';
       }
    }
    return 0;
}