Pagini recente » Cod sursa (job #696113) | Cod sursa (job #1454873) | Cod sursa (job #3148060) | Cod sursa (job #373488) | Cod sursa (job #523268)
Cod sursa(job #523268)
#include <iostream>
#include <fstream>
#define DN 400005
using namespace std;
int n,p,gls,gld,l[DN],r[DN],s[DN];
void v(int vn,int ls, int ld) {
if(gls<=ls && gld>=ld) {
l[vn]=r[vn]=s[vn]=0;
return;
}
int m=(ls+ld)>>1,fs=vn<<1;
if(gls<=m) v(fs,ls,m);
if(gld>m) v(fs+1,m+1,ld);
s[vn]=max(max(s[fs],s[fs+1]),l[fs+1]+r[fs] );
l[vn]=l[fs];
if(m-ls+1==l[fs]) l[vn]+=l[fs+1];
r[vn]=r[fs+1];
if(ld-m==r[fs+1]) r[vn]+=r[fs];
}
void pl(int vn,int ls, int ld) {
if(gls<=ls && gld>=ld) {
l[vn]=r[vn]=s[vn]=ld-ls+1;
return;
}
int m=(ls+ld)>>1,fs=vn<<1;
if(0==s[vn]) {
s[fs]=l[fs]=r[fs]=0;
s[fs+1]=l[fs+1]=r[fs+1]=0;
}
if(gls<=m) pl(fs,ls,m);
if(gld>m) pl(fs+1,m+1,ld);
s[vn]=max(max(s[fs],s[fs+1]),l[fs+1]+r[fs] );
l[vn]=l[fs];
if(m-ls+1==l[fs]) l[vn]+=l[fs+1];
r[vn]=r[fs+1];
if(ld-m==r[fs+1]) r[vn]+=r[fs];
}
int main()
{
ifstream f("hotel.in");
ofstream g("hotel.out");
f>>n>>p;
l[1]=r[1]=s[1]=n;
for(;p;--p) {
int op;
f>>op;
if(3!=op) {
f>>gls>>gld;
gld=gls+gld-1;
if(1==op) v(1,1,n);
else pl(1,1,n);
}else g<<s[1]<<'\n';
}
return 0;
}