Cod sursa(job #2068406)

Utilizator geralt_of_riviajohn nathalis geralt_of_rivia Data 17 noiembrie 2017 19:06:52
Problema Hotel Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <fstream>

using namespace std;
ifstream cin ("hotel.in");
ofstream cout ("hotel.out");
int beg[1000100],endd[1000100],heap[1000100];
int n,m,lft,rght,val1,val2,l;
void up_date (int st,int dr,int nod)
{
    if(st>=lft && dr<=rght) {beg[nod]=val1,endd[nod]=val2,heap[nod]=val2-val1+1; if(val1==-1) heap[nod]=-1; }
    else
    {
        int mij=(st+dr)/2;
        if(lft<=mij) up_date(st,mij,nod*2);
        if(rght>mij) up_date(mij+1,dr,nod*2+1);
        heap[nod]=max(heap[nod*2],heap[nod*2+1]);
        if(beg[nod*2]==beg[nod*2+1]) beg[nod]=beg[nod*2]; else beg[nod]=-2;
        if(endd[nod*2]==endd[nod*2+1]) endd[nod]=endd[nod*2]; else endd[nod]=-2;
    }
}
void ask_me (int st,int dr,int nod)
{
    if(lft>=st && lft<=dr && beg[nod]!=-2) { val1=beg[nod]; val2=endd[nod]; }
    else
    {
        int mij=(st+dr)/2;
        if(lft<=mij) ask_me(st,mij,nod*2);
        else ask_me(mij+1,dr,nod*2+1);
    }
}
void solve_1 (int a,int b)
{    lft=a; ask_me(1,n,1);
    int c=val1,d=val2;
    lft=a; rght=b; val1=val2=-1;
    up_date(1,n,1);
    lft=c; rght=a-1; val1=c; val2=a-1;
    if(lft<=rght) up_date(1,n,1);
    lft=b+1; rght=d; val1=lft; val2=d;
    if(lft<=rght) up_date(1,n,1);
}
void solve_2 (int a,int b)
{
    lft=a-1; if(lft>=1 && lft<=n) ask_me(1,n,1); else val1=-1;
    int c=val1; if(c==-1) c=a;
    lft=b+1; if(lft>=1 && lft<=n) ask_me(1,n,1); else val2=-1;
    int d=val2; if(d==-1) d=b;
    val1=c; val2=d; lft=c; rght=d;
    up_date(1,n,1);
}
void read ()
{ int p;
    cin>>n>>m;
    beg[1]=1; endd[1]=n;
    l=1; heap[1]=n; int a,b;
    for(int i=1;i<=m;i++)
    {
        cin>>p;
        if(p==1)
        {
            cin>>a>>b;
            b=a+b-1;
            solve_1(a,b);
        }
        else if(p==2)
        {
            cin>>a>>b;
            b=a+b-1;
            solve_2(a,b);
        }
        else cout<<heap[1]<<"\n";
    }
}
int main()
{
    read();
    cin.close();
    cout.close();
    return 0;
}