답안 #767452

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
767452 2023-06-26T19:17:29 Z NintsiChkhaidze Growing Trees (BOI11_grow) C++17
0 / 100
108 ms 7788 KB
#include <bits/stdc++.h>
#define pb push_back
#define s second
#define f first
#define ll long long
#define pii pair <int,int>
#define left (h<<1),l,((l + r)>>1)
#define right ((h<<1)|1),((l+r)>>1) + 1,r
#define int ll // ?
using namespace std;

const int N = 1e5 + 5,inf = 1e9;

int lz[4*N],a[N];

struct {
	int mx;
	int mn;
} t[4*N];

void push(int h){
	if (lz[h] == 0) return;
	lz[h*2] += lz[h];
	lz[h*2 + 1] += lz[h];
	t[h*2].mx += lz[h];
	t[h*2].mn += lz[h];
	t[h*2 + 1].mn += lz[h];
	t[h*2 + 1].mx += lz[h];
	lz[h] =0;
}

void build(int h,int l,int r){
	if (l == r){
		t[h].mn = t[h].mx = a[l];
		return;
	}
	build(left);
	build(right);
	t[h].mx = max(t[h*2].mx,t[h*2 + 1].mx);
	t[h].mn = min(t[h*2].mn,t[h*2 + 1].mn);
}

int get(int h,int l,int r,int idx){
	if (l == r) return t[h].mx;
	push(h);
	int mid = (l + r)/2;
	if (idx > mid) return get(right,idx);
	return get(left,idx);
}

void upd(int h,int l,int r,int L,int R,int val){
	if (r < L || R < l) return;
	if (L <= l && r <= R){
		t[h].mn += val;
		t[h].mx += val;
		lz[h] += val;
		return;
	}
	push(h);
	upd(left,L,R,val);
	upd(right,L,R,val);
	t[h].mx = max(t[h*2].mx,t[h*2 + 1].mx);
	t[h].mn = min(t[h*2].mn,t[h*2 + 1].mn);
}
int find(int h,int l,int r,int H){
	if (l == r) return l;
	push(h);
	if (t[h*2].mx >= H) return find(left,H);
	return find(right,H);
}
int findlast(int h,int l,int r,int H){
	if (l == r) return l;
	push(h);
	if (t[h*2 + 1].mn <= H) return findlast(right,H);
	return findlast(left,H);
}
signed main (){
	ios_base::sync_with_stdio(0),cin.tie(NULL),cout.tie(NULL);
	
	int n,Q;
	cin>>n>>Q;

	for (int i = 1; i <= n; i++)
		cin>>a[i];
	
	sort(a+1,a+n+1);
	build(1,1,n);

	while (Q--){
		char c;
		cin>>c;
		if (c == 'C'){
			int le,ri;
			cin>>le>>ri;
			
			if (t[1].mx < le || t[1].mn > ri) {
				cout<<0<<endl;
				continue;
			}

			int l = find(1,1,n,le);
			int r = findlast(1,1,n,ri); 
			cout<<max(0LL,r - l + 1)<<"\n";
		}else{
			int x,h;
			cin>>x>>h;

			if (t[1].mx < h) continue;
			int l = find(1,1,n,h),r = min(n,l + x - 1);
			int val = get(1,1,n,r);
			int rr = findlast(1,1,n,val - 1);

			if (l <= rr){
				upd(1,1,n,l,rr,1);
				x -= (rr - l + 1);
			}
			
			r = findlast(1,1,n,val);
			upd(1,1,n,r - x + 1,r,1);
		}
	}
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 72 ms 7384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 468 KB Output is correct
2 Incorrect 2 ms 468 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 84 ms 1084 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 108 ms 960 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 73 ms 4068 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 58 ms 7236 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 88 ms 7300 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 106 ms 7360 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 65 ms 7372 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 74 ms 7788 KB Output isn't correct
2 Halted 0 ms 0 KB -