Cod sursa(job #2405320)

Utilizator MoldooooooooMoldoveanu Stefan Moldoooooooo Data 14 aprilie 2019 12:39:55
Problema Hotel Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.21 kb
#include <iostream>
#include <fstream>
//N<=100000
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
int N, P, i;
struct Str{
    int seq, left, right;
    void Get(int p){
        seq=left=right=p;
        return;
    }
};
class BTree{
    Str V[700001];
    int Lazy[700001];
    void Change(int left, int right, int a, int b, int position, int val){
        int mid=(a+b)/2;
        if(Lazy[position]!=-1){Lazy[2*position]=Lazy[position];
                               Lazy[2*position+1]=Lazy[position];
                               if(Lazy[2*position]==1) V[2*position].Get(mid-a+1);
                                  else V[2*position].Get(0);
                               if(Lazy[2*position+1]==1) V[2*position+1].Get(b-mid);
                                  else V[2*position+1].Get(0);
                               Lazy[position]=-1;}
        if(a==left && right==b){if(val==1)V[position].Get(b-a+1); else V[position].Get(0); if(a!=b)Lazy[position]=val; return;}
        if(right<=mid) Change(left, right, a, mid, 2*position, val);
        else if(left>mid) Change(left, right, mid+1, b, 2*position+1, val);
        else {Change(left, mid, a, mid, 2*position, val); Change(mid+1, right, mid+1, b, 2*position+1, val);}
        V[position].seq=max(max(V[2*position].seq, V[2*position+1].seq), V[2*position].right+V[2*position+1].left);
        V[position].left=V[2*position].left;
        if(V[2*position].left==(mid-a+1)) V[position].left+=V[2*position+1].left;
        V[position].right=V[2*position+1].right;
        if(V[2*position+1].right==(b-mid)) V[position].right+=V[2*position].right;
        return;
    }
public:
    void Init(){
        for(i=1; i<=4*N; ++i) Lazy[i]=-1;
    }
    int top(){
        return V[1].seq;
    }
    void Set(int left, int right, int val){
        Change(left, right, 1, N, 1, val);
        return;
    }
};
BTree Arb;
int main()
{
    fin>>N>>P;
    Arb.Init();
    Arb.Set(1, N, 1);
    for(i=1; i<=P; ++i){
        int a, b, c;
        fin>>c;
        if(c==3) fout<<Arb.top()<<"\n";
        else {
            fin>>a>>b;
            if(c==2) c=0;
            Arb.Set(a, a+b-1, 1-c);
        }
    }
    return 0;
}