Cod sursa(job #1212175)

Utilizator CostanMiriamCostan Miriam CostanMiriam Data 23 iulie 2014 22:27:16
Problema Hotel Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.47 kb
#include <fstream>
#include <algorithm>

using namespace std;

ifstream fin ("hotel.in");
ofstream fout ("hotel.out");

struct data{
    int x;
    int y;
    int z;
}a[400010];

int n,m,t,i,ab,b;

void update1 (int nod,int st, int dr) {

    if (ab<=st && b>=dr) {
        a[nod].x=a[nod].y=a[nod].z=0;
        return;
    }
    if (st==dr)
        return;

    int mid=(dr+st)/2;

    if (a[nod].x==a[nod].y && a[nod].y==a[nod].z && a[nod].z==0){
        a[2*nod].x=a[2*nod].y=a[2*nod].z=0;
        a[2*nod+1].x=a[2*nod+1].y=a[2*nod+1].z=0;
    }else
        if (a[nod].x==a[nod].y && a[nod].y==a[nod].z && a[nod].z==dr-st+1) {
            a[2*nod].x=a[2*nod].y=a[2*nod].z=mid-st+1;
            a[2*nod+1].x=a[2*nod+1].y=a[2*nod+1].z=dr-mid;
        }

    if (ab<=mid)
        update1(2*nod,st,mid);
    if (b>mid)
        update1(2*nod+1,mid+1,dr);

    a[nod].x=a[2*nod].x;
    if (a[2*nod].x==mid-st+1)
        a[nod].x+=a[2*nod+1].x;

    a[nod].y=a[2*nod+1].y;
    if (a[2*nod+1].y==dr-mid)
        a[nod].y+=a[2*nod].y;

    a[nod].z=max(a[2*nod].z,max(a[2*nod+1].z,a[2*nod].y+a[2*nod+1].x));
}

void update2 (int nod,int st, int dr) {

    if (ab<=st && b>=dr) {
        a[nod].x=a[nod].y=a[nod].z=dr-st+1;
        return;
    }

    if (st == dr)
        return;

    int mid=st+(dr-st)/2;

    if (a[nod].x==a[nod].y && a[nod].y==a[nod].z && a[nod].z==0){
        a[2*nod].x=a[2*nod].y=a[2*nod].z=0;
        a[2*nod+1].x=a[2*nod+1].y=a[2*nod+1].z=0;
    }else
        if (a[nod].x==a[nod].y && a[nod].y==a[nod].z && a[nod].z==dr-st+1) {
            a[2*nod].x=a[2*nod].y=a[2*nod].z=mid-st+1;
            a[2*nod+1].x=a[2*nod+1].y=a[2*nod+1].z=dr-mid;
        }

    if (ab<=mid)
        update2(2*nod,st,mid);
    if (b>mid)
        update2(2*nod+1,mid+1,dr);

    a[nod].x=a[2*nod].x;
    if (a[2*nod].x==mid-st+1)
        a[nod].x+=a[2*nod+1].x;

    a[nod].y=a[2*nod+1].y;
    if (a[2*nod+1].y==dr-mid)
        a[nod].y+=a[2*nod].y;

    a[nod].z=max(a[2*nod].z,max(a[2*nod+1].z,a[2*nod].y+a[2*nod+1].x));
}

int main () {

    fin>>n>>m;
    a[1].x=a[1].y=a[1].z=n;
    while (m--) {
        fin>>t;
        if (t==1) {
            fin>>ab>>i;
            b=i+ab-1;
            update1(1,1,n);
        }else
            if (t==2) {
                fin>>ab>>i;
                b=i+ab-1;
                update2(1,1,n);
            }else
                fout<<a[1].z<<"\n";
    }


    return 0;
}