Pagini recente » Cod sursa (job #2657226) | Cod sursa (job #1026875) | Cod sursa (job #3157373) | Cod sursa (job #100159) | Cod sursa (job #2423166)
#include <fstream>
using namespace std;
ifstream cin("hotel.in");
ofstream cout("hotel.out");
struct Node{
int val,maxim,st,dr;
};
Node aint[1 << 17 + 1];
int maxim = 0;
void init(int nod,int st,int dr){
aint[nod].maxim = aint[nod].st = aint[nod].dr = dr - st + 1;
if(st == dr){
return;
}
init(2 * nod,st ,(st + dr) / 2);
init(2 * nod + 1,(st + dr) / 2 + 1,dr);
}
void update(int nod,int st,int dr,int a,int b,int val){
int mid = st + dr;
mid /= 2;
if(a <= st && dr <= b){
aint[nod].maxim = aint[nod].st = aint[nod].dr = val * (dr -st + 1);
return;
}
if (aint[nod].maxim == (1 - val) * (dr - st + 1))
{
aint[nod * 2].maxim = aint[nod * 2].st = aint[nod * 2].dr = (1 - val) * (mid - st + 1);
aint[nod * 2 + 1].maxim = aint[nod * 2 + 1].st = aint[nod * 2 + 1].dr = (1 - val) * (dr - mid);
}
if(a <= mid){
update(nod * 2,st,mid,a,b,val);
}
if(b > mid){
update(nod * 2 + 1,mid + 1,dr,a,b,val);
}
aint[nod].st = aint[nod * 2].st;
aint[nod].dr = aint[nod * 2 + 1].dr;
if(aint[nod].st == mid - st + 1)
aint[nod].st += aint[nod * 2 + 1].st;
if(aint[nod].dr == dr - mid){
aint[nod].dr += aint[nod * 2].dr;
}
aint[nod].maxim = max(aint[nod].st,max(aint[nod].dr,aint[nod * 2].dr + aint[nod * 2 + 1].st));
}
int main()
{
int n,m;
cin >> n >> m;
init(1,1,n);
while(m--){
int cerinta;
cin >> cerinta;
if(cerinta == 1){
int a,b;
cin >> a >> b;
update(1,1,n,a,a + b - 1,0);
}else if(cerinta == 2){
int a,b;
cin >> a >> b;
update(1,1,n,a,a + b - 1,1);
}else{
cout << aint[1].maxim << "\n";
}
}
return 0;
}