Cod sursa(job #2149298)

Utilizator tiberiu.bucur17Tiberiu Constantin Emanoil Bucur tiberiu.bucur17 Data 2 martie 2018 14:47:39
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.69 kb
#include <cstdio>
#include <iostream>
#define MAXN 100001
struct arbore
{
    int left,right,smax;
    bool cobor;
}aint[4*MAXN];
int x,y;
void update(int p,int st,int dr)
{
    if(x<=st && dr<=y)
    {
        aint[p].smax=aint[p].left=aint[p].right=(!aint[p].smax)*(st-dr+1);
        aint[p].cobor=true;
    }
    else
    {
        int m=(st+dr)>>1;
        if(aint[p].cobor)
        {
            aint[2*p].smax=aint[2*p].left=aint[2*p].right=(aint[p].smax!=0)*(m-st+1);
            aint[2*p+1].smax=aint[2*p+1].left=aint[2*p+1].right=(aint[p].smax!=0)*(dr-m);
            aint[2*p].cobor=aint[2*p+1].cobor=true;
            aint[p].cobor=false;
        }
        if(x<=m)
            update(2*p,st,m);
        if(y>m)
            update(2*p+1,m+1,dr);
        aint[p].smax=std::max(aint[2*p].smax,aint[2*p+1].smax);
        aint[p].smax=std::max(aint[p].smax,aint[2*p].right+aint[2*p+1].left);
        aint[p].left=aint[2*p].left;
        if(aint[2*p].left==m-st+1)
            aint[p].left+=aint[2*p+1].left;
        aint[p].right=aint[2*p+1].right;
        if(aint[2*p+1].right==dr-m)
            aint[p].right+=aint[2*p].right;
    }
}
int main()
{
    FILE *fin,*fout;
    fin=fopen("hotel.in","r");
    fout=fopen("hotel.out","w");
    int n,p,tip;
    fscanf(fin,"%d%d",&n,&p);
    aint[1].left=aint[1].right=aint[1].smax=n;
    aint[1].cobor=true;
    for(int i=0;i<p;i++)
    {
        fscanf(fin,"%d",&tip);
        if(tip==3)
            fprintf(fout,"%d\n",aint[1].smax);
        else
        {
            fscanf(fin,"%d%d",&x,&y);
            y+=x-1;
            update(1,1,n);
        }
    }
    fclose(fin);
    fclose(fout);
    return 0;
}