Cod sursa(job #2405298)

Utilizator MoldooooooooMoldoveanu Stefan Moldoooooooo Data 14 aprilie 2019 12:00:48
Problema Hotel Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.56 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[400001];
    void Change(int left, int right, int a, int b, int position, int val){
        int mid=(a+b)/2;
        if(a==b){V[position].Get(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:
    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.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;
}