Cod sursa(job #1008196)

Utilizator mirceadinoMircea Popoveniuc mirceadino Data 10 octombrie 2013 16:22:08
Problema Hotel Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.89 kb
#include<cstdio>
#include<algorithm>
#define NMAX 100000+5
#define KMAX (1<<18)+5
using namespace std;
struct nod
{
    int lc,lmax,lst,ldr;
};
int N,P,K,Type,A,B;
nod AI[KMAX];
void update(int R,int lo,int hi)
{
    int md=(lo+hi)/2;
    if(B<lo || hi<A) return;
    if(lo==hi)
    {
        AI[R].lc=AI[R].lst=AI[R].ldr=Type;
        return;
    }
    update(2*R,lo,md);
    update(2*R+1,md+1,hi);
    AI[R].lc=max(AI[2*R].ldr+AI[2*R+1].lst,max(AI[2*R].lc,AI[2*R+1].lc));
    AI[R].lmax=AI[2*R].lmax*2;
    if(AI[2*R].lst==AI[2*R].lmax) AI[R].lst=AI[2*R].lmax+AI[2*R+1].lst;
    else AI[R].lst=AI[2*R].lst;
    if(AI[2*R+1].ldr==AI[2*R+1].lmax) AI[R].ldr=AI[2*R].ldr+AI[2*R+1].lmax;
    else AI[R].ldr=AI[2*R+1].ldr;
}
int main()
{
    int i,j;
    freopen("hotel.in","r",stdin);
    freopen("hotel.out","w",stdout);
    scanf("%d%d",&N,&P);
    for(K=1;K<N;K<<=1);
    for(i=K;i<=K+N-1;i++) AI[i].lc=AI[i].lst=AI[i].ldr=AI[i].lmax=1;
    for(;i<=2*K-1;i++) AI[i].lmax=1;
    for(i=K-1;i>=1;i--)
    {
        AI[i].lc=max(AI[2*i].ldr+AI[2*i+1].lst,max(AI[2*i].lc,AI[2*i+1].lc));
        AI[i].lmax=AI[2*i].lmax*2;
        if(AI[2*i].lst==AI[2*i].lmax) AI[i].lst=AI[2*i].lmax+AI[2*i+1].lst;
        else AI[i].lst=AI[2*i].lst;
        if(AI[2*i+1].ldr==AI[2*i+1].lmax) AI[i].ldr=AI[2*i].ldr+AI[2*i+1].lmax;
        else AI[i].ldr=AI[2*i+1].ldr;
    }
    for(;P;--P)
    {
        scanf("%d",&Type);
        if(Type==3)
        {
            printf("%d\n",AI[1].lc);
            continue;
        }
        scanf("%d%d",&A,&B); B+=A-1;
        Type--;
        update(1,1,K);
        /*for(i=1,j=2;i<=2*K-1;i++)
        {
            printf("Nodul %d: %d in stanga, %d in dreapta, %d general (%d maxim)\n",i,AI[i].lst,AI[i].ldr,AI[i].lc,AI[i].lmax);
            if(i==j-1) {printf("\n"); j<<=1;}
        }
        printf("----------------\n\n");*/
    }
    return 0;
}