Submission #307084

#TimeUsernameProblemLanguageResultExecution timeMemory
307084RainbowbunnyGrowing Trees (BOI11_grow)C++17
100 / 100
316 ms5496 KiB
#include <bits/stdc++.h>
#define mp make_pair
#define eb emplace_back
#define fi first
#define se second
using namespace std;
using cd = complex <double>;
 
typedef pair <int, int> pii;
const long long INF = 1e18;
const int mod = 1e9 + 7;//1e9 + 7;//786433;//998244353;
const double Pi = acos(-1);
 
void Fastio()
{
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
}
 
int n, m;
int a[100005], b[100005];
int ST[400005], lazy[400005];
 
void Build(int node, int l, int r)
{
	if(l == r)
	{
		ST[node] = a[l];
		a[l] = node;
		return; 
	}
	int mid = (l + r) >> 1;
	Build(node << 1, l, mid);
	Build(node << 1 | 1, mid + 1, r);
	ST[node] = max(ST[node << 1], ST[node << 1 | 1]);
}
 
void Push(int node, int l, int r)
{
	if(lazy[node])
	{
		if(l != r)
		{
			lazy[node << 1] += lazy[node];
			lazy[node << 1 | 1] += lazy[node]; 
		}
		ST[node] += lazy[node];
		lazy[node] = 0;
	}
}
 
void Update(int node, int l, int r, int L, int R)
{
	Push(node, l, r);
	if(R < l or r < L or L > R)
	{
		return;
	}
	if(l >= L and r <= R)
	{
		lazy[node]++;
		Push(node, l, r);
		return;
	}
	int mid = (l + r) >> 1;
	Update(node << 1, l, mid, L, R);
	Update(node << 1 | 1, mid + 1, r, L, R);
	ST[node] = max(ST[node << 1], ST[node << 1 | 1]);
}
 
int TrueVal(int node, int l, int r)
{
	Push(node, l, r);
	return ST[node];
}
 
int Search(int node, int l, int r, int val)
{
	Push(node, l, r);
	if(ST[1] < val)
	{
		return n + 1;
	}
	if(l == r)
	{
		return r;
	}
	int mid = (l + r) >> 1;
	if(TrueVal(node << 1, l, mid) >= val)
	{
		return Search(node << 1, l, mid, val);
	}
	return Search(node << 1 | 1, mid + 1, r, val);
}
 
signed main()
{
	Fastio();
	cin >> n >> m;
	for(int i = 1; i <= n; i++)
	{
		cin >> a[i];
	}
	sort(a + 1, a + n + 1);
	for(int i = 1; i <= n; i++)
	{
		b[i] = a[i];
	}
	Build(1, 1, n);
	while(m--)
	{
		char type;
		cin >> type;
		if(type == 'F')
		{
			int c, h;
			cin >> c >> h;
			for(int i = 18; i > 0; i--)
			{
				Push(a[1] >> i, 1, 2);
			}
			Push(a[1], 1, 1);
			int l = Search(1, 1, n, h);
			if(l + c - 1 > n)
			{
				Update(1, 1, n, l, n);
				for(int i = l; i <= n; i++)
				{
					b[i]++;
				}
				continue;
			}
			int r = l + c - 1;
			for(int i = 18; i > 0; i--)
			{
				Push(a[r] >> i, 1, 2);
			}
			Push(a[r], r, r);
			int temp = c;
			// ST[a[r]]
			int ll = Search(1, 1, n, ST[a[r]]), rr = Search(1, 1, n, ST[a[r]] + 1);
			Update(1, 1, n, l, ll - 1);
			c -= (ll - l);
			Update(1, 1, n, rr - c, rr - 1);
		}
		else
		{
			int l, r;
			cin >> l >> r;
			cout << Search(1, 1, n, r + 1) - Search(1, 1, n, l) << '\n';
		}
	}
}

Compilation message (stderr)

grow.cpp: In function 'int main()':
grow.cpp:140:8: warning: unused variable 'temp' [-Wunused-variable]
  140 |    int temp = c;
      |        ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...