样例未过,评测仅过Subtask1,求调
查看原帖
样例未过,评测仅过Subtask1,求调
785630
YangXiaopei楼主2023/12/23 10:00

rt

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n, m, ans[400005], lx[400005], rx[400005], tag[400005];
void pushup(int cur, int lt, int rt){
	int mid = lt + rt >> 1;
	if(ans[cur << 1] == mid - lt + 1){
		lx[cur] = ans[cur << 1] + lx[cur << 1 | 1];
	}
	else{
		lx[cur] = lx[cur << 1];
	}
	if(ans[cur << 1 | 1] == rt - mid){
		rx[cur] = ans[cur << 1 | 1] + rx[cur << 1];
	}
	else{
		rx[cur] = rx[cur << 1 | 1];
	}
	ans[cur] = max({ans[cur << 1], ans[cur << 1 | 1], lx[cur << 1 | 1] + rx[cur << 1]});
}
void lazytag(int cur, int lt, int rt, int x, int y, int z){
	tag[cur << 1] = tag[cur << 1 | 1] = x;
	ans[cur << 1] = lx[cur << 1] = rx[cur << 1] = y;
	ans[cur << 1 | 1] = lx[cur << 1 | 1] = rx[cur << 1 | 1] = z;
}
void pushdown(int cur, int lt, int rt){
	if(tag[cur] == 0){
		return;
	}
	if(tag[cur] == 1){
		lazytag(cur, lt, rt, 1, 0, 0);
	}
	if(tag[cur] == 2){
		int mid = lt + rt >> 1;
		lazytag(cur, lt, rt, 2, mid - lt + 1, rt - mid);
	}
	tag[cur] = 0;
}
void build(int cur, int lt, int rt){
	lx[cur] = rx[cur] = ans[cur] = rt - lt + 1;
	if(lt == rt){
		return;
	}
	int mid = lt + rt >> 1;
	build(cur << 1, lt, mid);
	build(cur << 1 | 1, mid + 1, rt);
}
void update(int cur, int lt, int rt, int qx, int qy, int val){
	pushdown(cur, lt, rt);
	if(qy <= lt || rt <= qx){
		return;
	}
	if(qx <= lt && rt <= qy){
		int x = 0;
		if(val != 1){
			x = rt - lt + 1;	
		}
		ans[cur] = lx[cur] = rx[cur] = x;
		tag[cur] = val;
		return;
	}
	int mid = lt + rt >> 1;
	update(cur << 1, lt, mid, qx, qy, val);
	update(cur << 1 | 1, mid + 1, rt, qx, qy, val);
	pushup(cur, lt, rt);
}
int query(int cur, int lt, int rt, int kri){
	pushdown(cur, lt, rt);
	if(lt == rt){
		return lt;
	}
	int mid = lt + rt >> 1;
	if(ans[cur << 1] >= kri){
		return query(cur << 1, lt, mid, kri);
	}
	if(rx[cur << 1] + lx[cur << 1 | 1] < kri){
		return query(cur << 1 | 1, mid + 1, rt, kri);
	}
	return mid - rx[cur << 1] + 1;
}
signed main(){
	cin >> n >> m;
	build(1, 1, n);
	while(m--){
		int op;
		cin >> op;
		if(op == 1){
			int x;
			cin >> x;
			if(ans[1] >= x){
				int y = query(1, 1, n, x);
				cout << y << "\n";
				update(1, 1, n, y, y + x - 1, 1);
			}
			else{
				cout << 0 << "\n";
			}
		}
		else{
			int x, y;
			cin >> x >> y;
			update(1, 1, n, x, x + y - 1, 2);
		}
	}
	return 0;
}
2023/12/23 10:00
加载中...