Pagini recente » Rezultatele filtrării | Diferente pentru utilizator/andrici_cezar intre reviziile 178 si 164 | Rezultatele filtrării | Borderou de evaluare (job #2955659) | Cod sursa (job #536878)
Cod sursa(job #536878)
#include <fstream>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
#define maxn 400005
int i,N,M,P,a,b,c,val;
int A[maxn],L[maxn],R[maxn];
inline int max(int a, int b)
{
return a>b ? a : b;
}
void init(int k, int st, int dr)
{
A[k]=L[k]=R[k]=dr-st+1;
if(st==dr) return;
int m=st+(dr-st)/2;
init(2*k,st,m);
init(2*k+1,m+1,dr);
}
void update(int k, int st, int dr)
{
if(a<=st && dr<=b)
{
A[k]=L[k]=R[k]=val*(dr-st+1);
return;
}
int m=st+(dr-st)/2;
if(A[k]==0) { A[2*k]=L[2*k]=R[2*k]=0; A[2*k+1]=L[2*k+1]=R[2*k+1]=0; }
if(A[k]==dr-st+1)
{ A[2*k]=L[2*k]=R[2*k]=m-st+1; A[2*k+1]=L[2*k+1]=R[2*k+1]=dr-m; }
if(a<=m) update(2*k,st,m);
if(m<b) update(2*k+1,m+1,dr);
L[k]=L[2*k];
if(L[2*k]==m-st+1) L[k]+=L[2*k+1];
R[k]=R[2*k+1];
if(R[2*k+1]==dr-m) R[k]+=R[2*k];
A[k]=max( max(A[2*k],A[2*k+1]), R[2*k]+L[2*k+1] );
}
int main()
{
fin >> N >> P;
init(1,1,N);
for(;P;P--)
{
fin >> c;
if(c==3) { fout << A[1] << '\n'; continue; }
fin >> i >> M;
a=i; b=i+M-1; val= c-1;
update(1,1,N);
}
}