Pagini recente » Cod sursa (job #270573) | Cod sursa (job #1478930) | Cod sursa (job #1550860) | Cod sursa (job #2868436) | Cod sursa (job #1212175)
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin ("hotel.in");
ofstream fout ("hotel.out");
struct data{
int x;
int y;
int z;
}a[400010];
int n,m,t,i,ab,b;
void update1 (int nod,int st, int dr) {
if (ab<=st && b>=dr) {
a[nod].x=a[nod].y=a[nod].z=0;
return;
}
if (st==dr)
return;
int mid=(dr+st)/2;
if (a[nod].x==a[nod].y && a[nod].y==a[nod].z && a[nod].z==0){
a[2*nod].x=a[2*nod].y=a[2*nod].z=0;
a[2*nod+1].x=a[2*nod+1].y=a[2*nod+1].z=0;
}else
if (a[nod].x==a[nod].y && a[nod].y==a[nod].z && a[nod].z==dr-st+1) {
a[2*nod].x=a[2*nod].y=a[2*nod].z=mid-st+1;
a[2*nod+1].x=a[2*nod+1].y=a[2*nod+1].z=dr-mid;
}
if (ab<=mid)
update1(2*nod,st,mid);
if (b>mid)
update1(2*nod+1,mid+1,dr);
a[nod].x=a[2*nod].x;
if (a[2*nod].x==mid-st+1)
a[nod].x+=a[2*nod+1].x;
a[nod].y=a[2*nod+1].y;
if (a[2*nod+1].y==dr-mid)
a[nod].y+=a[2*nod].y;
a[nod].z=max(a[2*nod].z,max(a[2*nod+1].z,a[2*nod].y+a[2*nod+1].x));
}
void update2 (int nod,int st, int dr) {
if (ab<=st && b>=dr) {
a[nod].x=a[nod].y=a[nod].z=dr-st+1;
return;
}
if (st == dr)
return;
int mid=st+(dr-st)/2;
if (a[nod].x==a[nod].y && a[nod].y==a[nod].z && a[nod].z==0){
a[2*nod].x=a[2*nod].y=a[2*nod].z=0;
a[2*nod+1].x=a[2*nod+1].y=a[2*nod+1].z=0;
}else
if (a[nod].x==a[nod].y && a[nod].y==a[nod].z && a[nod].z==dr-st+1) {
a[2*nod].x=a[2*nod].y=a[2*nod].z=mid-st+1;
a[2*nod+1].x=a[2*nod+1].y=a[2*nod+1].z=dr-mid;
}
if (ab<=mid)
update2(2*nod,st,mid);
if (b>mid)
update2(2*nod+1,mid+1,dr);
a[nod].x=a[2*nod].x;
if (a[2*nod].x==mid-st+1)
a[nod].x+=a[2*nod+1].x;
a[nod].y=a[2*nod+1].y;
if (a[2*nod+1].y==dr-mid)
a[nod].y+=a[2*nod].y;
a[nod].z=max(a[2*nod].z,max(a[2*nod+1].z,a[2*nod].y+a[2*nod+1].x));
}
int main () {
fin>>n>>m;
a[1].x=a[1].y=a[1].z=n;
while (m--) {
fin>>t;
if (t==1) {
fin>>ab>>i;
b=i+ab-1;
update1(1,1,n);
}else
if (t==2) {
fin>>ab>>i;
b=i+ab-1;
update2(1,1,n);
}else
fout<<a[1].z<<"\n";
}
return 0;
}