Pagini recente » Cod sursa (job #1578932) | Cod sursa (job #530618) | Istoria paginii runda/grigorieeeee/clasament | Cod sursa (job #2119412) | Cod sursa (job #2918223)
#include<bits/stdc++.h>
using namespace std;
ifstream f("hotel.in");
ofstream g("hotel.out");
///st=lungimea celei mai lungi secvente de 0 care incepe din capatul din st(->)
///dr=lungimea celei mai lungi secvente de 0 care incepe din capatul din dr(<-)
///ans=lungimea maxima a unei secvente de 0 pe intervalul st,dr
struct node
{
int left,right,ans,viz;
} aint[400005];
void update(int nod, int st, int dr, int l, int r, int val)
{
if(l<=st && r>=dr)
{
aint[nod].viz=1;
if(val==1)
aint[nod].left=aint[nod].right=aint[nod].ans=0;
else
aint[nod].left=aint[nod].right=aint[nod].ans=dr-st+1;
return;
}
int mij=(st+dr)/2;
if(aint[nod].viz==1)
{
aint[nod].viz=0;
if(aint[nod].ans==0)
{
aint[2*nod].ans=aint[2*nod].left=aint[2*nod].right=0;
aint[2*nod+1].ans=aint[2*nod+1].left=aint[2*nod+1].right=0;
}
else
{
aint[2*nod].ans=aint[2*nod].left=aint[2*nod].right=mij-st+1;
aint[2*nod+1].ans=aint[2*nod+1].left=aint[2*nod+1].right=dr-mij;
}
aint[nod*2].viz=aint[nod*2+1].viz=1;
}
if(l<=mij)
update(2*nod,st,mij,l,r,val);
if(r>mij)
update(2*nod+1,mij+1,dr,l,r,val);
aint[nod].ans=max({aint[nod*2].ans,aint[nod*2+1].ans,aint[nod*2].right+aint[nod*2+1].left});
aint[nod].left=aint[nod*2].left;
aint[nod].right=aint[nod*2+1].right;
if(aint[nod].left==mij-st+1)
aint[nod].left+=aint[2*nod+1].left;
if(aint[nod].right==dr-mij)
aint[nod].right+=aint[2*nod].right;
}
int main()
{
int n,m,i,a,b,nr;
f>>n>>m;
update(1,1,n,1,n,2);
for(i=1; i<=m; i++)
{
f>>nr;
if(nr==3)
g<<aint[1].ans<<'\n';
else
{
f>>a>>b;
update(1,1,n,a,a+b-1,nr);
}
}
return 0;
}