Submission #27303

#TimeUsernameProblemLanguageResultExecution timeMemory
27303kajebiiiRuka (COI15_ruka)C++14
100 / 100
513 ms19052 KiB
#include <stdio.h>
#include <bits/stdc++.h>
 
using namespace std;
 
#define SZ(v) ((int)(v).size())
#define ALL(v) (v).begin(),(v).end()
#define one first
#define two second
typedef long long ll;
typedef pair<int, int> pi; typedef pair<ll, int> pli; typedef pair<ll, pi> plp;
typedef tuple<int, int, int> ti; typedef tuple<ll, int, int> tli;
const int INF = 0x3f2f1f0f;
const ll LINF = 1ll * INF * INF;
 
const int MAX_N = 1e5 + 1000, BASE = 5e7 + 100;
 
int N, Q, Nr[2][MAX_N];
struct NODE {
	int l, r, v;
	NODE *lp, *rp;
	NODE(int a, int b) : l(a), r(b), v(0), lp(NULL), rp(NULL) {}
	void update(int a, int b, int k) {
		if(r < a || b < l) return;
		if(a <= l && r <= b) {
//			printf("[%d %d] %d %d | %d\n", l, r, a, b, k);
			v += k;
			return;
		}
		int m = (l+r) >> 1;
		if(!lp) lp = new NODE(l  , m); lp -> update(a, b, k);
		if(!rp) rp = new NODE(m+1, r); rp -> update(a, b, k);
	}
	int getSum(int i) {
		if(r < i || i < l) return 0;
		int m = (l+r) >> 1;
		int res = v;
		if(lp) res += lp -> getSum(i);
		if(rp) res += rp -> getSum(i);
		return res;
	}
}*root[2];
void update(int t, int a, int b, int k) {
	if(a > b) swap(a, b);
	root[t] -> update(a, b, k);
}
int getSum(int t, int v) {
	return root[t] -> getSum(v);
}
int main() {
	cin >> N;
	for(int i=0; i<N; i++) {
		int x, y; scanf("%d%d", &x, &y);
		Nr[0][i] = x; Nr[1][i] = y;
	}
	root[0] = new NODE(-BASE, +BASE);
	root[1] = new NODE(-BASE, +BASE);
 
	int now[2] = {1, 1};
	for(int i=0; i<N; i++) {
		for(int k=0; k<2; k++) {
			int next = now[k] + Nr[k][i];
			update(k, now[k], next, 1);
			now[k] = next;
		}
	}
 
	cin >> Q;
	int cur = 0, cnt = 0;
 
	now[0] = now[1] = 1;
	int ori[2] = {0, 0};
	while(Q--) {
		char s[5]; scanf("%s", s);
		if(s[0] == 'C') {
			int nr[2]; scanf("%d%d", &nr[0], &nr[1]);
			for(int k=0; k<2; k++) {
				update(k, now[k] + ori[k], now[k] + ori[k] + Nr[k][cur], -1);
				ori[k] += Nr[k][cur] - nr[k];
				Nr[k][cur] = nr[k];
				update(k, now[k] + ori[k], now[k] + ori[k] + Nr[k][cur], +1);
			}
		} else if(s[0] == 'F') {
			if(cur == N-1) continue;
			for(int k=0; k<2; k++) {
				if( (now[k] < 0) ^ (now[k] + Nr[k][cur]) < 0 ) cnt++;
				update(k, now[k] + ori[k], now[k] + ori[k] + Nr[k][cur], -1);
				now[k] += Nr[k][cur];
			}
			cur = min(N-1, cur+1);
		} else if(s[0] == 'B') {
			if(cur == 0) continue;
			for(int k=0; k<2; k++) {
				if((now[k] < 0) ^ (now[k] - Nr[k][cur-1]) < 0) cnt--;
				update(k, now[k] + ori[k] - Nr[k][cur-1], now[k] + ori[k], +1);
				now[k] -= Nr[k][cur-1];
			}
			cur = max(0, cur-1);
		} else if(s[0] == 'Q') {
			printf("%d\n", cnt + getSum(0, ori[0]) + getSum(1, ori[1]));
		}else assert(false);
	}
 
 
	return 0;
}

Compilation message (stderr)

ruka.cpp: In member function 'int NODE::getSum(int)':
ruka.cpp:36:7: warning: unused variable 'm' [-Wunused-variable]
   int m = (l+r) >> 1;
       ^
ruka.cpp: In function 'int main()':
ruka.cpp:86:46: warning: suggest parentheses around comparison in operand of '^' [-Wparentheses]
     if( (now[k] < 0) ^ (now[k] + Nr[k][cur]) < 0 ) cnt++;
                                              ^
ruka.cpp:94:47: warning: suggest parentheses around comparison in operand of '^' [-Wparentheses]
     if((now[k] < 0) ^ (now[k] - Nr[k][cur-1]) < 0) cnt--;
                                               ^
ruka.cpp:53:34: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   int x, y; scanf("%d%d", &x, &y);
                                  ^
ruka.cpp:74:28: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   char s[5]; scanf("%s", s);
                            ^
ruka.cpp:76:44: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    int nr[2]; scanf("%d%d", &nr[0], &nr[1]);
                                            ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...