Pagini recente » Cod sursa (job #538614) | Cod sursa (job #578941) | Cod sursa (job #1229971) | Cod sursa (job #1776242) | Cod sursa (job #1008195)
#include<cstdio>
#include<algorithm>
#define NMAX 100000+5
#define KMAX (1<<17)+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;
}