Cod sursa(job #2132653)

Utilizator alexandra_paticaAndreea Alexandra Patica alexandra_patica Data 15 februarie 2018 22:32:56
Problema Hotel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <cstdio>
#include <algorithm>
using namespace std;
struct punct
{
    int x, y;
}a[400004];
int n, m, j, tip, ind, nr, Arb[400004], k, Max;

void update1(int nod, int st, int dr)
{
    if (st==dr){
        Arb[nod]=1;
        return;
    }
    int mij=(st+dr)/2;
    if (j<=mij) update1(2*nod, st, mij);
    else update1(2*nod+1, mij+1, dr);
    Arb[nod]=Arb[2*nod]+Arb[2*nod+1];

}

void update2(int nod, int st, int dr)
{
    if (st==dr){
        Arb[nod]=0;
        return;
    }
    int mij=(st+dr)/2;
    if (j<=mij) update2(2*nod, st, mij);
    else update2(2*nod+1, mij+1, dr);
    Arb[nod]=Arb[2*nod]+Arb[2*nod+1];
}

void cauta(int st, int dr)
{
    int p=k;
    for (int i=1; i<=k; i++)
        if (a[i].y+1==st) p=i;

    if ((p==k && a[k].y+1!=st) || k==0){
        k++;
        a[k].x=st; a[k].y=dr;
    }
    else a[p].y=dr;
}

void query(int nod, int st, int dr)
{
    if (st>dr) return;
    if (Arb[nod]==0){
//        printf("nod=%d st=%d dr=%d\n", nod, st, dr);
        cauta(st, dr);
        return;
    }
    if (st==dr) return;
    int mij=(st+dr)/2;
    query(2*nod, st, mij);
    query(2*nod+1, mij+1, dr);
}

int main ()
{
    freopen("hotel.in", "r", stdin);
    freopen("hotel.out", "w", stdout);

    scanf("%d%d", &n, &m);

    for (int l=1; l<=m; l++){
        scanf("%d", &tip);

        if (tip==1){
            scanf("%d%d", &ind, &nr);
            for(j=ind; j<ind+nr; j++)
                update1(1, 1, n);
        }

        else if (tip==2){
            scanf("%d%d", &ind, &nr);
            for(j=ind; j<ind+nr; j++)
                update2(1, 1, n);
            for (int i=1; i<=k; i++){
                if (a[i].y-a[i].x+1>Max) Max=a[i].y-a[i].x+1;
//                printf("%d %d  ", a[i].x, a[i].y);
            }
//            printf("\n");
        }
        else{
                k=0;
            query(1, 1, n);
            Max=0;
            for (int i=1; i<=k; i++){
                if (a[i].y-a[i].x+1>Max) Max=a[i].y-a[i].x+1;
//                printf("%d %d  ", a[i].x, a[i].y);
            }
//            printf("\n");
            printf("%d\n", Max);
        }
    }

}