Pagini recente » Cod sursa (job #1327594) | Cod sursa (job #2516356) | Cod sursa (job #1063770) | Cod sursa (job #20823) | Cod sursa (job #1895316)
#include <fstream>
#define nmax 100050
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
struct arb
{
int l;
int maxl,maxr,maxt;
};
arb a[4*nmax];
int n,m,Narb;
void Change(int i)
{
int t;
while(i>0)
{ if(i%2==1) i--;
t=i/2;
{
a[t].maxt=max(a[i].maxt,a[i+1].maxt);
a[t].maxt=max(a[t].maxt, a[i].maxr+a[i+1].maxl);
if( a[i].maxl==a[i].l )
a[t].maxl=a[i].l+a[i+1].maxl;
else a[t].maxl=a[i].maxl;
if(a[i+1].maxr==a[i+1].l )
a[t].maxr=a[i+1].maxr+a[i].maxr;
else a[t].maxr=a[i+1].maxr;
}
i=t;
}
}
void Change1(int x,int y,int z)
{int i;
x=x+Narb-1;
if(x%2==0)
{ a[x].maxt=a[x].maxr=a[x].maxl=z;
x++;
}
for(i=x;i<=x+y-1;i=i+2)
{ a[i].maxl=a[i].maxr=a[i].maxt=z;
if(i+1<=x+y-1 ) a[i+1].maxl=a[i+1].maxr=a[i+1].maxt=z;
Change(i);
}
}
int main()
{ fin>>n>>m;
int i;
Narb=1;
while(Narb<n) Narb*=2;
for(i=0;i<n;++i)
a[Narb+i].l=a[Narb+i].maxl=a[Narb+i].maxr=a[Narb+i].maxt=1;
for(i=Narb-1;i>=1;--i)
{ a[i].l=a[i*2].l+a[i*2+1].l;
a[i].maxt= a[i*2].maxr+a[i*2+1].maxl;
a[i].maxr=a[i].maxl=a[i].maxt;
}
int op,x,y;
for(i=1;i<=m;++i)
{ fin>>op;
if(op==3)
fout<<a[1].maxt<<"\n";
if(op==1)
{ fin>>x>>y;
Change1(x,y,0);
}
if(op==2)
{ fin>>x>>y;
Change1(x,y,1);
}
}
return 0;
}