Submission #1257032

#TimeUsernameProblemLanguageResultExecution timeMemory
1257032terracottaliteGrowing Trees (BOI11_grow)C++20
0 / 100
1096 ms1092 KiB
#include <stdio.h>
#include <algorithm>
using namespace std;

const int N = 100005;
int n, m;
int b[N] = { 0 };
int a[N] = { 0 };

void update(int p, int v) {
	while (p <= n) {
		b[p] += v;
		p += p&-p;
	}
}

int query(int r) {
	int res = 0;
	while (r > 0) {
		res += b[r];
		r -= r&-r;
	}
	return res;
}

int bs(int h) {
	int l = 0;
	int r = n+1;

	while (r-l>1) {
		int m = (l+r)/2;
		if (query(m) < h) {
			l = m;
		} else {
			r = m;
		}
	}

	return r;
}

int main()
{
	scanf("%d %d", &n, &m);

	for (int i=1;i<=n;i++) {
		scanf("%d", &a[i]);
	}

	sort(a+1, a+n+1);

	for (int i=1;i<=n;i++) {
		update(i, a[i]-a[i-1]);
	}

	/*
	map<int, int> mp;

	for (int i=n;i>0;i--) {
		mp[a[i]] = i;
	}
	*/

	char ty[4];
	while (m--) {
		scanf("%s", ty);

		if (ty[0] == 'F') {
			int c, h;
			scanf("%d %d", &c, &h);

			int r = bs(h);

			if (query(r) != query(r+c)) {
				update(r, 1);
			}

			int lm = bs(query(r+c)+1)-1;
			int nm = bs(query(r+c));
			int nc = c-(nm-r);

			update(nm, -1);
			update(lm+1, -1);
			update(lm-nc+1, 1);

			//printf("%d %d %d %d\n", r ,lm ,nm, nc);

			/*
			putchar('x');
			for (int i=1;i<=n;i++) {
				printf(" %d", query(i));
			}
			putchar('\n');
			*/
		} else {
			int l, r;
			scanf("%d %d", &l, &r);

			printf("%d\n", bs(r+1) - bs(l));
		}
	}
}

Compilation message (stderr)

grow.cpp: In function 'int main()':
grow.cpp:44:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   44 |         scanf("%d %d", &n, &m);
      |         ~~~~~^~~~~~~~~~~~~~~~~
grow.cpp:47:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   47 |                 scanf("%d", &a[i]);
      |                 ~~~~~^~~~~~~~~~~~~
grow.cpp:66:22: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   66 |                 scanf("%s", ty);
      |                 ~~~~~^~~~~~~~~~
grow.cpp:70:30: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   70 |                         scanf("%d %d", &c, &h);
      |                         ~~~~~^~~~~~~~~~~~~~~~~
grow.cpp:97:30: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   97 |                         scanf("%d %d", &l, &r);
      |                         ~~~~~^~~~~~~~~~~~~~~~~
#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...