Cod sursa(job #1976384)

Utilizator Daria09Florea Daria Daria09 Data 3 mai 2017 11:40:57
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.73 kb
#include <iostream>
#include <fstream>
#define dim 100005
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
struct arbore
{
    int best,left,right;
};
arbore arb[4*dim];
int n,p,caz,a,b;
void update(int nod,int st,int dr)
{
    if(st>b||dr<a)return;
    if(a<=st&&dr<=b)
    {
        if(caz==1)
            arb[nod].best=arb[nod].right=arb[nod].left=0;
        else
            arb[nod].best=arb[nod].right=arb[nod].left=dr-st+1;
        return;
    }
    int mij=(st+dr)/2;
    if(arb[nod].best==0)
        arb[2*nod].best=arb[2*nod].left=arb[2*nod].right=arb[2*nod+1].best=arb[2*nod+1].right=arb[2*nod+1].left=0;
    if(arb[nod].best==dr-st+1)
    {
        arb[2*nod].best=arb[2*nod].right=arb[2*nod].left=mij-st+1;
        arb[2*nod+1].best=arb[2*nod+1].right=arb[2*nod+1].left=dr-mij;
    }
    update(2*nod,st,mij);
    update(2*nod+1,mij+1,dr);
    arb[nod].best=max(max(arb[2*nod].best,arb[2*nod+1].best),arb[2*nod].right+arb[2*nod+1].left);
    arb[nod].left=arb[2*nod].left;
    arb[nod].right=arb[2*nod+1].right;
    if(arb[2*nod].left==mij-st+1)
        arb[nod].left+=arb[2*nod+1].left;
    if(arb[2*nod+1].right==dr-mij)
        arb[nod].right+=arb[2*nod].right;
}
int main()
{
    f>>n>>p;
    int N=1;
    while(N<n)N*=2;
    for(int i=0; i<n; ++i)
        arb[N+i].best=arb[N+i].right=arb[N+i].left=1;
    for(int i=N-1; i>=1; --i)
        arb[i].best=arb[i].right=arb[i].left=arb[i*2].right+arb[i*2+1].left;
    for(int i=1; i<=p; i++)
    {
        f>>caz;
        if(caz==3)
            g<<arb[1].best<<'\n';
        else
        {
            f>>a>>b;
            b+=a-1;
            update(1,1,n);
        }
    }
    f.close();
    g.close();
    return 0;
}