LEM4 - WHITE BLACK
Tác giả: hieult
Ngôn ngữ: C++
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
#include<cassert>
#include<ctime>
#include<algorithm>
#include<iterator>
#include<iostream>
#include<cctype>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<queue>
#include<list>
//#include<conio.h>
#define ep 0.000001
#define maxn 10011
#define mod 1000000000
#define TR(c, it) for(typeof((c).begin()) it=(c).begin(); it!=(c).end(); it++)
#define fi first
#define se second
double const PI=4*atan(1);
double const oo = 1e19;
using namespace std;
typedef pair<int, int> II;
typedef vector<int> VI;
typedef vector<II> VII;
typedef vector<VI> VVI;
typedef vector<VII> VVII;
struct tree{
int maxleft, maxright, length;
tree(){};
tree(int _ml, int _mr, int _l){
maxleft = _ml, maxright = _mr, length = _l;
}
};
tree empty = tree(0, 0, 0);
int n, m, number, u, v;
tree f[maxn * 4];
void update(int l, int r, int i, int so){
if(u > r || v < l) return;
int t = (r - l + 1) * so;
if(u <= l && v >= r){
f[i] = tree(t, t, t);
return;
}
// if(f[i].length == t) return;
int mid = (l + r) / 2;
if(f[i].length == 0){
f[i + i] = empty;
f[i + i + 1] = empty;
}
if(f[i].length == r - l + 1){
f[i + i] = tree(mid - l + 1, mid - l + 1, mid - l + 1);
f[i + i + 1] = tree(r - mid, r - mid, r - mid);
}
update(l, mid, i + i, so);
update(mid + 1, r, i + i + 1, so);
f[i].length = max(f[i + i].length, max(f[i + i + 1].length, f[i + i].maxright + f[i + i + 1].maxleft));
if(f[i + i].maxleft == mid - l + 1) f[i].maxleft = f[i + i + 1].maxleft + mid - l + 1;
else f[i].maxleft = f[i + i].maxleft;
if(f[i + i + 1].maxright == r - mid) f[i].maxright = f[i + i].maxright + r - mid;
else f[i].maxright = f[i + i + 1].maxright;
}
int main(){
//freopen("input.in","r",stdin);
//freopen("output.out","w",stdout);
scanf("%d %d",&n,&m);
for(int i = 1; i <= n; i++) {
u = 1, v = i;
update(1, n, 1, 1);
}
//printf("%d.......\n",f[1].length);
for(int i = 0; i < m; i++){
scanf("%d",&number);
if(number == 3) printf("%d\n",f[1].length);
else{
scanf("%d %d",&u,&v);
number = 2 - number;
update(1, n, 1, number);
}
}
// getch();
}