re了10个点怎么办,救助!!
查看原帖
re了10个点怎么办,救助!!
657372
Rose_Lu楼主2023/7/6 16:12
#include <iostream>

using namespace std;
const int Max = 5000003;

long long n , m , tot , len1 , len2;
long long t[Max<<2] , add[Max<<2] , ans[Max] , cost[Max];

struct zx{
	long long bo , l , r , k , id;
}p[Max] , p1[Max] , p2[Max];

void lazy(long long x , long long l , long long r) {
	long long mid = l + r >> 1;
	t[x*2] += add[x] * (mid - l + 1);
	t[x*2+1] += add[x] * (r - mid);
	add[x*2] += add[x];
	add[x*2+1] += add[x];
	add[x] = 0;
}

void change(long long x , long long front , long long tail , long long l  , long long r , long long v) {
	if(front >= l && tail <= r) {
		t[x] += v * (tail - front + 1);
		add[x] += v;
		return ;
	}
	lazy(x , front , tail);
	long long mid = front + tail >> 1;
	if(l <= mid) change (x*2 , front , mid , l , r , v);
	if(r > mid) change (x*2+1 , mid+1 , r , l , r , v);
	t[x] = t[x*2] + t[x*2+1];
}

long long ask(long long x , long long front , long long tail , long long l , long long r) {
	if(front >= l && tail <= r) return t[x];
	long long mid = front + tail >> 1 , ans = 0;
	lazy(x , front , tail);
	if(l <= mid) ans += ask (x*2 , front , mid , l , r);
	if(r > mid) ans += ask(x*2+1 , mid+1 , tail , l , r);
	return ans;
}

void work(long long front , long long tail , long long l , long long r) {
	if(front > tail || l > r) return ;
	if(l == r) {
		for(long long i = front; i <= tail; i++) {
			if(p[i].bo == 2) ans[p[i].id] = l;
		}
		return ;
	}
	long long mid = l + r >> 1;
	for(long long i = front; i <= tail; i++) {
		if(p[i].bo == 1 && p[i].k > mid) change(1 , 1 , n , p[i].l , p[i].r , 1);
		else if(p[i].bo == 2) cost [i] = ask(1 , 1 , n , p[i].l , p[i].r);
	}
	for(long long i = front; i <= tail; i++) {
		if(p[i].bo == 1 && p[i].k > mid) change(1 , 1 , n , p[i].l , p[i].r , -1);
	}
	long long len1 = 0 , len2 = 0;
	for(long long i = front; i <= tail; i++) {
		if(p[i].bo == 2) {
			if(p[i].k <= cost[i]) p2[len2++] = p[i];
			else {
				p[i].k -= cost[i];
				p1[len1++] = p[i];
			}
		}
		else {
			if(p[i].k <= mid) p1[len1++] = p[i];
			else p2[len2++] = p[i];
		}
	}
	for(long long i = 0; i < len1; i++) p[front+i] = p1[i]; 
	for(long long i = 0; i < len2; i++) p[front+i+len1] = p2[i];
	work(front , front+len1-1 , l , mid);
	work(front+len1 , tail , mid+1 , r);
}

int main() {
	cin >> n >> m;
	for(long long i = 1; i <= m; i++) {
		cin >> p[i].bo >> p[i].l >> p[i].r >> p[i].k;
		if(p[i].bo == 2) p[i].id = tot ++;
	}
	work(1 , m , 0 , n);
	for(long long i = 0; i < tot; i++) cout << ans[i] <<endl;
	return 0;
}
2023/7/6 16:12
加载中...