Pagini recente » Cod sursa (job #1409700) | Cod sursa (job #999890) | Cod sursa (job #2035654) | Cod sursa (job #19701) | Cod sursa (job #726497)
Cod sursa(job #726497)
//Include
#include <fstream>
using namespace std;
//Definitii
#define leftSon node<<1
#define rightSon (node<<1)+1
//Constante
const int MAX_SIZE = (int)1e5+1;
//Structuri
struct
{
int val;
int left;
int right;
int camera;
} tree[MAX_SIZE<<2];
//Functii
void update(int node, int left, int right);
void expand(int node, int left, int right);
//Variabile
ifstream in("hotel.in");
ofstream out("hotel.out");
int nrCamere, nrOperatii;
int question;
int intervalLeft, intervalRight, type;
//Main
int main()
{
in >> nrCamere >> nrOperatii;
tree[1].camera = -1;
expand(1, 1, nrCamere);
while(nrOperatii--)
{
in >> question;
switch(question)
{
case 1:
{
in >> intervalLeft >> intervalRight;
intervalRight += intervalLeft - 1;
type = 1;
update(1, 1, nrCamere);
break;
}
case 2:
{
in >> intervalLeft >> intervalRight;
intervalRight += intervalLeft - 1;
type = -1;
update(1, 1, nrCamere);
break;
}
default:
out << tree[1].val << '\n';
}
}
in.close();
out.close();
return 0;
}
void update(int node, int left, int right)
{
if(intervalLeft <= left && right <= intervalRight)
{
tree[node].camera = type;
expand(node, left, right);
return;
}
expand(node, left, right);
int mid = (left + right)>>1;
if(intervalLeft <= mid)
update(leftSon, left, mid);
if(mid < intervalRight)
update(rightSon, mid+1, right);
expand(leftSon, left, mid);
expand(rightSon, mid+1, right);
int max1 = max(tree[leftSon].val, tree[rightSon].val);
int max2 = tree[leftSon].right + tree[rightSon].left;
tree[node].val = max(max1, max2);
tree[node].left = (tree[leftSon].val == mid-left+1)? (tree[leftSon].val + tree[rightSon].left) : (tree[leftSon].left);
tree[node].right = (tree[rightSon].val == right-mid)? (tree[rightSon].val + tree[leftSon].right) : (tree[rightSon].right);
}
void expand(int node, int left, int right)
{
if(tree[node].camera)
{
if(tree[node].camera == 1)
tree[node].val = tree[node].left = tree[node].right = 0;
else
tree[node].val = tree[node].left = tree[node].right = right - left + 1;
if(left != right)
tree[leftSon].camera = tree[rightSon].camera = tree[node].camera;
tree[node].camera = 0;
}
}