Cod sursa(job #1711098)

Utilizator Bodo171Bogdan Pop Bodo171 Data 30 mai 2016 16:00:07
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.91 kb
#include <iostream>
#include<fstream>
using namespace std;
struct node
{
    int mx,left,right,full,viz,vall;
}arb[300005];
int i,n,q,x,y,st,dr,tip,val;
void update(int nod,int l,int r,int st,int dr,int val)
{
    if(st<=l && r<=dr)
    {
        x=r-l+1;
        arb[nod].vall=val;
        if(val==1)
        {
            arb[nod].left=0;
            arb[nod].right=0;
            arb[nod].mx=0;
            arb[nod].full=0;
            arb[nod].viz=1;
        }
        else
        {
            arb[nod].left=x;
            arb[nod].right=x;
            arb[nod].mx=x;
            arb[nod].full=1;
            arb[nod].viz=1;
        }
        return;
    }
    int m=(l+r)/2;
    if(arb[nod].viz==1)
    {
        update(2*nod,l,m,l,m,arb[nod].vall);
        update(2*nod+1,m+1,r,m+1,r,arb[nod].vall);
        arb[nod].viz=0;
    }
    if(st<=m) update(2*nod,l,m,st,dr,val);
    if(m<dr) update(2*nod+1,m+1,r,st,dr,val);

    if(arb[2*nod+1].full==1) arb[nod].right=arb[2*nod].right+arb[2*nod+1].mx;
      else arb[nod].right=arb[2*nod+1].right;

    if(arb[2*nod].full==1) arb[nod].left=arb[2*nod].mx+arb[2*nod+1].left;
       else arb[nod].left=arb[2*nod].left;
    arb[nod].mx=max(arb[2*nod].right+arb[2*nod+1].left,max(arb[2*nod].mx,arb[2*nod+1].mx));
    if(arb[2*nod].full==1&&arb[2*nod+1].full==1) arb[nod].full=1;
    else arb[nod].full=0;
}
int main()
{
    ifstream f("hotel.in");
    ofstream g("hotel.out");
    f>>n>>q;
    update(1,1,n,1,n,0);
   for(i=1;i<=q;i++)
    {
        f>>tip;
        if(tip==1)
        {
            val=1;
            f>>x>>y;
            st=x;dr=x+y-1;
            update(1,1,n,st,dr,1);
            continue;
        }
        if(tip==2)
        {
            f>>x>>y;
            st=x;
            dr=x+y-1;
            update(1,1,n,st,dr,0);
            continue;
        }
        g<<arb[1].mx<<'\n';
    }
    return 0;
}