Cod sursa(job #2127237)

Utilizator patcasrarespatcas rares danut patcasrares Data 10 februarie 2018 14:42:48
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include<fstream>
#include<vector>
#include<iostream>
#include<queue>
#define pb push_back
#define x first
#define y second
#define DN 100005
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int n,a[4*DN],f,l,p,r[DN],val,type,ma,b[4*DN];
void update(int nod,int st,int dr,int semn)
{
    if(st>=f&&dr<=l)
    {
        a[nod]=val;
        return;
    }
    if(semn==2)
        semn=a[nod];
    int mij=(st+dr)/2;
    if(mij>=f)
        update(2*nod,st,mij,semn);
    else
        if(semn!=2)
            a[2*nod]=semn;
    if(mij<l)
        update(2*nod+1,mij+1,dr,semn);
    else
        if(semn!=2)
            a[2*nod+1]=semn;
    if(a[2*nod]==0&&a[2*nod+1]==0)
    {
        a[nod]=0;
        return;
    }
    if(a[2*nod]==1&&a[2*nod+1]==1)
    {
        a[nod]=1;
        return;
    }
    a[nod]=2;
}
void query(int nod,int st,int dr)
{
    if(a[nod]==1)
    {
        r[dr]=r[st-1]+dr-st+1;
        ma=max(ma,r[dr]);
        return;
    }
    if(a[nod]==0)
    {
        r[st]=0;
        r[dr]=0;
        return;
    }
    int mij=(st+dr)/2;
    if(a[2*nod]!=0)
        query(2*nod,st,mij);
    else
        r[mij]=0;
    if(a[2*nod+1]!=0)
        query(2*nod+1,mij+1,dr);
    else
        r[dr]=0;
}
int main()
{
    fin>>n>>p;
    for(int i=1;i<=n;i++)
    {
        f=l=i;
        val=1;
        update(1,1,n,2);
    }
    for(int i=1;i<=p;i++)
    {
        fin>>type;
        if(type==1)
        {
            fin>>f>>l;
            l=f+l-1;
            val=0;
            update(1,1,n,2);
            continue;
        }
        if(type==2)
        {
            fin>>f>>l;
            l=f+l-1;
            val=1;
            update(1,1,n,2);
            continue;
        }
        ma=0;
        query(1,1,n);
        fout<<ma<<'\n';
    }
}