Pagini recente » Cod sursa (job #635831) | Cod sursa (job #1218652) | Cod sursa (job #788558) | Cod sursa (job #3288521) | Cod sursa (job #2777299)
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
const int SIZE = 1e5+10;
ifstream in("hotel.in");
ofstream out("hotel.out");
struct interval
{
int maxim;
int left, right;
bool isLazy;
bool isFull;
};
int n, m;
interval arb[SIZE*4];
int qry, a, b;
bool on;
void coutInterval(int ind, int st, int dr)
{
cout<<"arb de "<<st<<" "<<dr<<" = vvv\n";
cout<<"maxim = "<<arb[ind].maxim<<"\n";
cout<<"left = "<<arb[ind].left<<"\n";
cout<<"right = "<<arb[ind].right<<"\n";
cout<<"isLazy = "<<arb[ind].isLazy<<"\n";
if(arb[ind].isLazy) cout<<"isFull = "<<arb[ind].isFull<<"\n";
cout<<"&&&\n\n";
}
void coutArb(int ind, int st, int dr)
{
coutInterval(ind, st, dr);
if(st>=dr) return;
int mid = (st + dr) / 2;
coutArb(ind*2, st, mid);
coutArb(ind*2+1, mid+1, dr);
}
void lazyUpdate(int ind, int st, int dr)
{
if(arb[ind].isLazy)
{
arb[ind].left = arb[ind].right = arb[ind].maxim = arb[ind].isFull;
arb[ind].isLazy = 0;
if(st<dr)
{
arb[ind*2].isLazy = 1;
arb[ind*2+1].isLazy = 1;
arb[ind*2].isFull = arb[ind].isFull;
arb[ind*2+1].isFull = arb[ind].isFull;
int mid = (st + dr) / 2;
arb[ind*2].maxim = arb[ind*2].left = arb[ind*2].right = arb[ind].isFull*(mid-st+1);
arb[ind*2+1].maxim = arb[ind*2+1].left = arb[ind*2+1].right = arb[ind].isFull*(dr-mid);
}
}
if(a<=st && dr<=b)
{
arb[ind].isFull = on;
arb[ind].maxim = on*(dr-st+1);
arb[ind].left = on*(dr-st+1);
arb[ind].right = on*(dr-st+1);
arb[ind*2].isLazy = arb[ind*2+1].isLazy = 1;
arb[ind*2].isFull = arb[ind*2+1].isFull = on;
return;
}
if(st>=dr) return;
int mid = (st + dr) / 2;
if(a<=mid) lazyUpdate(ind*2, st, mid);
if(b>mid) lazyUpdate(ind*2+1, mid+1, dr);
arb[ind].left = arb[ind*2].left;
if(arb[ind*2].maxim == mid-st+1) arb[ind].left += arb[ind*2+1].left;
arb[ind].right = arb[ind*2+1].right;
if(arb[ind*2+1].maxim == dr-mid) arb[ind].right += arb[ind*2].right;
arb[ind].maxim = max(arb[ind*2].right+arb[ind*2+1].left, max(arb[ind*2].maxim, arb[ind*2+1].maxim));
}
void setArb(int ind, int st, int dr)
{
arb[ind].left = arb[ind].right = arb[ind].maxim = dr-st+1;
if(st==dr) return;
int mid = (st + dr) / 2;
setArb(ind*2, st, mid), setArb(ind*2+1, mid+1, dr);
}
void readit()
{
in>>n>>m;
setArb(1, 1, n);
for(int i=1; i<=m; i++)
{
in>>qry;
if(qry==1)
{
in>>a>>b;
b+=a-1;
///cout<<"#"<<a<<' '<<b<<'\n';
on=0;
lazyUpdate(1, 1, n);
///coutArb(1, 1, n);
///return;
}
else if(qry==2)
{
in>>a>>b;
b+=a-1;
on=1;
lazyUpdate(1, 1, n);
}
else
{
out<<arb[1].maxim<<'\n';
}
}
}
/// 0 1 1 1 0 0 0 0 0 0 0 0
/// 0 1 1 1 0 0 0 0 1 1 1 1
/// 0 0 1 1 0 0 0 0 1 1 1 1
/// 0 0 1 1 0 0 0 0 0 0 1 1
/// 0 1 0 0 0 0 0 0 0 0 1 1
int main()
{
readit();
return 0;
}