Cod sursa(job #2759461)

Utilizator PopescuAndreiAlexandruPopescu Andrei Alexandru PopescuAndreiAlexandru Data 17 iunie 2021 22:53:05
Problema Hotel Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.06 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;

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

Info Tree[N*4+5];

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 BuildTree(int nod, int st, int dr)
{
    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 pos, int val)
{
    if(st==dr)
        {
            Tree[nod].left=Tree[nod].right=Tree[nod].best=val;
            return;
        }
    int mij=(st+dr)>>1;
    if(pos<=mij)
        UpdateTree(nod<<1,st,mij,pos,val);
    else
        UpdateTree(nod<<1|1,mij+1,dr,pos,val);
    UpdateNode(nod,st,dr);
}

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