Pagini recente » Cod sursa (job #775293) | Cod sursa (job #544606) | Cod sursa (job #699299) | Cod sursa (job #2805717) | Cod sursa (job #991965)
Cod sursa(job #991965)
#include <cstdio>
#include <algorithm>
using namespace std;
const int NMAX = 100003;
struct segment_tree {
int left, right, best;
short updated;
};
segment_tree AIB[NMAX * 3];
int _left, _right;
void AIB_build (const int &node, const int &left, const int &right) {
AIB[node].left = AIB[node].right = AIB[node].best = right - left + 1;
AIB[node].updated = 2;
if (left == right)
return;
const int &middle = left + right >> 1;
AIB_build (node * 2, left, middle);
AIB_build (node * 2 + 1, middle + 1, right);
}
void AIB_update (const int &node, const int &left, const int &right, const short &update) {
if (left >= _left && right <= _right) {
AIB[node].left = AIB[node].right = AIB[node].best = update ? right - left + 1 : 0;
AIB[node].updated = update;
return;
}
if (_right < left || _left > right)
return;
const int &middle = left + right >> 1;
if (AIB[node].updated != 2) {
int last_left = _left, last_right = _right;
_left = left;
_right = middle;
AIB_update (node * 2, left, middle, AIB[node].updated);
_left = middle + 1;
_right = right;
AIB_update (node * 2 + 1, middle + 1, right, AIB[node].updated);
_left = last_left;
_right = last_right;
AIB[node].updated = 2;
}
AIB_update (node * 2, left, middle, update);
AIB_update (node * 2 + 1, middle + 1, right, update);
AIB[node].best = max (max (AIB[node * 2].best, AIB[node * 2 + 1].best), AIB[node * 2].right + AIB[node * 2 + 1].left);
if (AIB[node * 2].left == middle - left + 1)
AIB[node].best = AIB[node].left = middle - left + 1 + AIB[node * 2 + 1].left;
else
AIB[node].left = AIB[node * 2].left;
if (AIB[node * 2 + 1].right == right - middle)
AIB[node].best = AIB[node].right = right - middle + AIB[node * 2].right;
else
AIB[node].right = AIB[node * 2 + 1].right;
}
int main () {
freopen ("hotel.in", "r", stdin);
freopen ("hotel.out", "w", stdout);
int N, P;
short t;
scanf ("%d%d", &N, &P);
AIB_build (1, 1, N);
while (P--) {
scanf ("%hd", &t);
if (t < 3) {
scanf ("%d%d", &_left, &_right);
_right += _left - 1;
AIB_update (1, 1, N, t - 1);
continue;
}
printf ("%d\n", AIB[1].best);
}
}