Cod sursa(job #2759465)

Utilizator PopescuAndreiAlexandruPopescu Andrei Alexandru PopescuAndreiAlexandru Data 17 iunie 2021 23:24:38
Problema Hotel Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.54 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <vector>
#include <cstring>

using namespace std;

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

const int N = 100005;

int n,q,e,x,y,Lazy[N*4+5];

struct Info
{
    int left,right,best;
};

Info Tree[N*4+5];

inline int max(int a, int b)
{
    return a>b?a:b;
}

void UpdateNode(int nod, int st, int dr)
{
    int mij=((st+dr)>>1)+1;

    Tree[nod].right = Tree[nod<<1|1].right;
    if(Tree[nod<<1|1].right==(dr-mij+1))
        Tree[nod].right += Tree[nod<<1].right;

    Tree[nod].left = Tree[nod<<1].left;
    if(Tree[nod<<1].left==((st+dr)>>1)-st+1)
        Tree[nod].left += Tree[nod<<1|1].left;

    Tree[nod].best=max(Tree[nod<<1].best,Tree[nod<<1|1].best);
    Tree[nod].best=max(Tree[nod].best,max(Tree[nod].left,Tree[nod].right));
    Tree[nod].best=max(Tree[nod].best,Tree[nod<<1].right+Tree[nod<<1|1].left);
}

void LazyUpdate(int nod, int st, int dr)
{
    int mij=((st+dr)>>1)+1;
    if(Lazy[nod]!=-1)
        {
            if(st!=dr)
                {
                    Lazy[nod<<1]=Lazy[nod<<1|1]=Lazy[nod];
                    Tree[nod<<1].left=Tree[nod<<1].right=Tree[nod<<1].best=(mij-st)*Lazy[nod];
                    Tree[nod<<1|1].left=Tree[nod<<1|1].right=Tree[nod<<1].best=(dr-mij+1)*Lazy[nod];
                }
            Lazy[nod]=-1;
        }
}

void BuildTree(int nod, int st, int dr)
{
    Lazy[nod]=-1;
    if(st==dr)
        {
            Tree[nod].left=Tree[nod].right=Tree[nod].best=1;
            return;
        }
    int mij=(st+dr)>>1;
    BuildTree(nod<<1,st,mij);
    BuildTree(nod<<1|1,mij+1,dr);
    UpdateNode(nod,st,dr);
}

void UpdateTree(int nod, int st, int dr, int a, int b, int val)
{
    if(st>=a && dr<=b)
        {
            Lazy[nod]=val;
            Tree[nod].left=Tree[nod].right=Tree[nod].best=(dr-st+1)*val;
            return;
        }
    LazyUpdate(nod,st,dr);
    int mij=(st+dr)>>1;
    if(a<=mij)
        UpdateTree(nod<<1,st,mij,a,b,val);
    if(b>mij)
        UpdateTree(nod<<1|1,mij+1,dr,a,b,val);
    UpdateNode(nod,st,dr);
}

int main()
{
    fin>>n>>q;
    BuildTree(1,1,n);
    while(q--)
        {
            fin>>e;
            if(e!=3)
                {
                    fin>>x>>y;
                    if(e==1)
                        UpdateTree(1,1,n,x,x+y-1,0);
                    else
                        UpdateTree(1,1,n,x,x+y-1,1);
                }
            else
                fout<<Tree[1].best<<'\n';
        }
}