Pagini recente » Cod sursa (job #1279141) | Cod sursa (job #2092131) | Cod sursa (job #2003175) | Cod sursa (job #1882840) | Cod sursa (job #1604913)
#include <fstream>
using namespace std;
ifstream fin("hotel.in");
ofstream fout("hotel.out");
struct coce{
int Max;
int from_left;
int from_right;
} v[500000] ;
int n,m,i,j,nr,c;
pair<int,int> interval;
void prnt()
{
for (int i=1;i<30;i++)
fout<<"v["<<i<<"].Max = "<<v[i].Max<<" ... v["<<i<<"].from_left = "<<v[i].from_left<<" ... v["<<i<<"].from_right = "<<v[i].from_right<<'\n';
fout<<"\n............................................\n";
}
int max_in_interval(int start, int stop)
{
return stop - start + 1;
}
void update_next(int nod, int start, int stop)
{
if (v[nod].Max == stop - start + 1)
{
int mij = (start + stop) / 2;
v[nod*2].Max = mij - start + 1;
v[nod*2].from_left = v[nod*2].Max;
v[nod*2].from_right = v[nod*2].Max;
v[nod*2+1].Max = stop - mij;
v[nod*2+1].from_left = v[nod*2+1].Max;
v[nod*2+1].from_right = v[nod*2+1].Max;
}
if (v[nod].Max == 0)
{
v[nod*2].Max = 0;
v[nod*2].from_left = 0;
v[nod*2].from_right = 0;
v[nod*2+1].Max = 0;
v[nod*2+1].from_left = 0;
v[nod*2+1].from_right = 0;
}
}
void update_arbore(int nod, int start, int stop, pair<int,int> itv)
{
if (stop < itv.first || start > itv.second)
return;
if (itv.first <= start && stop <= itv.second)
{
if (v[nod].Max == 0)
{
v[nod].Max = stop - start + 1;
v[nod].from_left = v[nod].Max;
v[nod].from_right = v[nod].Max;
}
else
{
v[nod].Max = 0;
v[nod].from_left = 0;
v[nod].from_right = 0;
}
}
else
{
update_next(nod, start, stop);
int mid = (start + stop) / 2;
update_arbore(nod * 2, start, mid, itv);
update_arbore(nod * 2 + 1, mid + 1, stop, itv);
v[nod].Max = max(v[nod*2].from_right+v[nod*2+1].from_left, max(v[nod*2].Max, v[nod*2+1].Max)) ;
if (v[nod*2].Max == max_in_interval(start, mid))
v[nod].from_left = v[nod*2].Max + v[nod*2+1].from_left;
else
v[nod].from_left = v[nod*2].from_left;
if (v[nod*2+1].Max == max_in_interval(mid + 1, stop))
v[nod].from_right = v[nod*2+1].Max + v[nod*2].from_right;
else
v[nod].from_right = v[nod*2+1].from_right;
}
}
int main()
{
fin>>n>>m;
update_arbore(1, 1, n, make_pair(1,n));
for (i=1;i<=m;i++)
{
fin>>c;
if (c == 1 || c == 2)
{
fin>>interval.first>>nr;
interval.second=interval.first+nr-1;
update_arbore(1, 1, n, interval);
//prnt();
}
else
{
fout<<v[1].Max<<"\n";
}
}
return 0;
}