답안 #206533

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
206533 2020-03-03T17:28:12 Z BorisBarca Klasika (COCI20_klasika) C++14
110 / 110
3233 ms 433068 KB
/*
$$$$$$$\                      $$\           $$$$$$$\
$$  __$$\                     \__|          $$  __$$\
$$ |  $$ | $$$$$$\   $$$$$$\  $$\  $$$$$$$\ $$ |  $$ | $$$$$$\   $$$$$$\   $$$$$$$\ $$$$$$\
$$$$$$$\ |$$  __$$\ $$  __$$\ $$ |$$  _____|$$$$$$$\ | \____$$\ $$  __$$\ $$  _____|\____$$\
$$  __$$\ $$ /  $$ |$$ |  \__|$$ |\$$$$$$\  $$  __$$\  $$$$$$$ |$$ |  \__|$$ /      $$$$$$$ |
$$ |  $$ |$$ |  $$ |$$ |      $$ | \____$$\ $$ |  $$ |$$  __$$ |$$ |      $$ |     $$  __$$ |
$$$$$$$  |\$$$$$$  |$$ |      $$ |$$$$$$$  |$$$$$$$  |\$$$$$$$ |$$ |      \$$$$$$$\\$$$$$$$ |
\_______/  \______/ \__|      \__|\_______/ \_______/  \_______|\__|       \_______|\_______|
*/
#include <bits/stdc++.h>

using namespace std;

#define PB push_back
#define MP make_pair
#define INS insert
#define LB lower_bound
#define UB upper_bound
#define pii pair <int,int>
#define pll pair <long long, long long>
#define si pair<string, int>
#define is pair<int, string>
#define X first
#define Y second
#define _ << " " <<
#define sz(x) (int)x.size()
#define all(a) (a).begin(),(a).end()
#define FOR(i, a, b) for (int i = (a); i < (b); ++i)
#define FORD(i, a, b) for (int i = (a); i > (b); --i)
#define FORR(i, l, r) for (int i = (l); i <= (r); ++i)
#define FORP(i, a, b) for ((i) = (a); (i) < (b); ++i)
#define FORA(i, x) for (auto &i : x)
#define REP(i, n) FOR(i, 0, n)
#define BITS(x) __builtin_popcount(x)
#define MSET memset
#define MCPY memcpy
#define SQ(a) (a) * (a)
#define TRACE(x) cout << #x " = " << (x) << '\n';
#define YES cout << "YES\n"
#define NO cout << "NO\n"

typedef long long ll;
typedef long double ld;
typedef vector <int> vi;
typedef vector <pii> vpi;
typedef vector <ll> vll;
typedef vector <pll> vpl;
typedef vector <double> vd;
typedef vector <ld> vld;
typedef vector<si> vsi;
typedef vector<is> vis;
typedef vector<string> vs;
//((float) t)/CLOCKS_PER_SEC

const int MOD = 1e9 + 7;
const double PI = acos(-1);
const int INF = 1e9 + 10;
const ll INFL = 1e18 + 10;
const int ABC = 30;
const int dx[] = {-1, 1, 0, 0};
const int dy[] = {0, 0, -1, 1};
const int dox[] = {-1, 1, 0, 0, -1, -1, 1, 1};
const int doy[] = {0, 0, -1, 1, -1, 1, -1, 1};

inline int sum(int a, int b){
	if (a + b < 0)
		return (a + b + MOD) % MOD;
	return (a + b) % MOD;
}

inline void add(int &a, int b){
	a = sum(a, b);
}

inline int mul(int a, int b){
	return (ll)a * (ll)b % MOD;
}

inline int sub(int a, int b){
	return (a - b + MOD) % MOD;
}

inline int fast_pot(ll pot, int n){
	ll ret = 1;
	while (n){
		if (n & 1)
			ret = (ret * pot) % MOD;
			pot = (pot * pot) % MOD;
			n >>= 1;
		}
	return ret;
}

inline int divide(int a, int b){
	return mul(a, fast_pot(b, MOD - 2));
}

ll lcm(ll a, ll b){
	return abs(a * b) / __gcd(a, b);
}

inline double ccw(pii A, pii B, pii C){
	return (A.X * B.Y) - (A.Y * B.X) + (B.X * C.Y) - (B.Y * C.X) + (C.X * A.Y) - (C.Y * A.X);
}

inline int CCW(pii A, pii B, pii C){
	double val = ccw(A, B, C);
	double eps = max(max(abs(A.X), abs(A.Y)), max(max(abs(B.X), abs(B.Y)), max(abs(C.X), abs(C.Y)))) / 1e9;
	if (val <= -eps)
		return -1;
	if (val >= eps)
		return 1;
	return 0;
}

void to_upper(string &x){
	REP(i, sz(x))
		x[i] = toupper(x[i]);
}

void to_lower(string &x){
	REP(i, sz(x))
		x[i] = tolower(x[i]);
}

string its(ll x){
	if (x == 0)
		return "0";
	string ret = "";
	while (x > 0){
		ret += (x % 10) + '0';
		x /= 10;
	}
	reverse(all(ret));
	return ret;
}

ll sti(string s){
	ll ret = 0;
	REP(i, sz(s)){
		ret *= 10;
		ret += (s[i] - '0');
	}
	return ret;
}

const int N = 2e5 + 10;

struct query{
	int t; 
	int x, y;
} Q[N];

int disc[N], up[N], path[N], idx;
vi e[N];

struct node{
	set <int> id;
	node *nxt[2];

	node(){
		id.clear();
		REP(i, 2)
			nxt[i] = NULL;
	}

} root;

void Add(node *curr, int b, int cvor){
	curr -> id.INS(disc[cvor]);
	if (b < 0)
		return;
	if (path[cvor] & (1 << b)){
		if (curr -> nxt[1] == NULL)
			curr -> nxt[1] = new node();
		Add(curr -> nxt[1], b - 1, cvor);
	} else {
		if (curr -> nxt[0] == NULL)
			curr -> nxt[0] = new node();
		Add(curr -> nxt[0], b - 1, cvor);
	}
}

int Query(node *curr, int b, int cvor, int lo, int hi){
	if (b < 0)
		return 0;
	if (path[cvor] & (1 << b)){
		auto nxt = curr -> nxt[0];
		if (nxt == NULL || nxt->id.lower_bound(lo) == nxt->id.upper_bound(hi))
			return Query(curr -> nxt[1], b - 1, cvor, lo, hi);
		return (1 << b) + Query(curr -> nxt[0], b - 1, cvor, lo, hi);
	} else {
		auto nxt = curr -> nxt[1];
		if (nxt == NULL || nxt->id.lower_bound(lo) == nxt->id.upper_bound(hi))
			return Query(curr -> nxt[0], b - 1, cvor, lo, hi);
		return (1 << b) + Query(curr -> nxt[1], b - 1, cvor, lo, hi);
	}
}

void dfs(int node){
	disc[node] = idx++;
	up[node] = disc[node];
	FORA(nxt, e[node]){
		dfs(nxt);
		up[node] = max(up[node], up[nxt]);
	}
}

int main () {
	ios_base::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int q; cin >> q;
	int n = 2;
	REP(i, q){
		string s; cin >> s;
		cin >> Q[i].x >> Q[i].y;
		if (s[0] == 'A'){
			Q[i].t = 0;
			e[Q[i].x].PB(n);
			path[n] = path[Q[i].x] ^ Q[i].y;
			n++;
		} else {
			Q[i].t = 1;
		}
	}

	idx = 0;
	dfs(1);
	Add(&root, 30, 1);
	n = 2;
	REP(i, q){
		if (Q[i].t == 0){
			Add(&root, 30, n);
			n++;
		} else
			cout << Query(&root, 30, Q[i].x, disc[Q[i].y], up[Q[i].y]) << '\n';
	}

	return 0;
}

Compilation message

klasika.cpp: In function 'int fast_pot(ll, int)':
klasika.cpp:87:3: warning: this 'if' clause does not guard... [-Wmisleading-indentation]
   if (n & 1)
   ^~
klasika.cpp:89:4: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'if'
    pot = (pot * pot) % MOD;
    ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 5240 KB Output is correct
2 Correct 8 ms 5368 KB Output is correct
3 Correct 8 ms 5496 KB Output is correct
4 Correct 8 ms 5624 KB Output is correct
5 Correct 8 ms 5240 KB Output is correct
6 Correct 8 ms 5368 KB Output is correct
7 Correct 8 ms 5496 KB Output is correct
8 Correct 9 ms 5624 KB Output is correct
9 Correct 8 ms 5240 KB Output is correct
10 Correct 9 ms 5496 KB Output is correct
11 Correct 9 ms 5496 KB Output is correct
12 Correct 9 ms 5624 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 5240 KB Output is correct
2 Correct 8 ms 5368 KB Output is correct
3 Correct 8 ms 5496 KB Output is correct
4 Correct 8 ms 5624 KB Output is correct
5 Correct 8 ms 5240 KB Output is correct
6 Correct 8 ms 5368 KB Output is correct
7 Correct 8 ms 5496 KB Output is correct
8 Correct 9 ms 5624 KB Output is correct
9 Correct 8 ms 5240 KB Output is correct
10 Correct 9 ms 5496 KB Output is correct
11 Correct 9 ms 5496 KB Output is correct
12 Correct 9 ms 5624 KB Output is correct
13 Correct 11 ms 6520 KB Output is correct
14 Correct 12 ms 7800 KB Output is correct
15 Correct 15 ms 9080 KB Output is correct
16 Correct 15 ms 10168 KB Output is correct
17 Correct 12 ms 6392 KB Output is correct
18 Correct 13 ms 7672 KB Output is correct
19 Correct 15 ms 8952 KB Output is correct
20 Correct 16 ms 10104 KB Output is correct
21 Correct 13 ms 6392 KB Output is correct
22 Correct 13 ms 7672 KB Output is correct
23 Correct 16 ms 9080 KB Output is correct
24 Correct 17 ms 10104 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1188 ms 121528 KB Output is correct
2 Correct 1776 ms 228088 KB Output is correct
3 Correct 2349 ms 330028 KB Output is correct
4 Correct 2807 ms 432944 KB Output is correct
5 Correct 970 ms 119544 KB Output is correct
6 Correct 1658 ms 224784 KB Output is correct
7 Correct 2280 ms 325596 KB Output is correct
8 Correct 2841 ms 426492 KB Output is correct
9 Correct 996 ms 119416 KB Output is correct
10 Correct 1720 ms 225440 KB Output is correct
11 Correct 2290 ms 327760 KB Output is correct
12 Correct 2864 ms 428016 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 5240 KB Output is correct
2 Correct 8 ms 5368 KB Output is correct
3 Correct 8 ms 5496 KB Output is correct
4 Correct 8 ms 5624 KB Output is correct
5 Correct 8 ms 5240 KB Output is correct
6 Correct 8 ms 5368 KB Output is correct
7 Correct 8 ms 5496 KB Output is correct
8 Correct 9 ms 5624 KB Output is correct
9 Correct 8 ms 5240 KB Output is correct
10 Correct 9 ms 5496 KB Output is correct
11 Correct 9 ms 5496 KB Output is correct
12 Correct 9 ms 5624 KB Output is correct
13 Correct 11 ms 6520 KB Output is correct
14 Correct 12 ms 7800 KB Output is correct
15 Correct 15 ms 9080 KB Output is correct
16 Correct 15 ms 10168 KB Output is correct
17 Correct 12 ms 6392 KB Output is correct
18 Correct 13 ms 7672 KB Output is correct
19 Correct 15 ms 8952 KB Output is correct
20 Correct 16 ms 10104 KB Output is correct
21 Correct 13 ms 6392 KB Output is correct
22 Correct 13 ms 7672 KB Output is correct
23 Correct 16 ms 9080 KB Output is correct
24 Correct 17 ms 10104 KB Output is correct
25 Correct 1188 ms 121528 KB Output is correct
26 Correct 1776 ms 228088 KB Output is correct
27 Correct 2349 ms 330028 KB Output is correct
28 Correct 2807 ms 432944 KB Output is correct
29 Correct 970 ms 119544 KB Output is correct
30 Correct 1658 ms 224784 KB Output is correct
31 Correct 2280 ms 325596 KB Output is correct
32 Correct 2841 ms 426492 KB Output is correct
33 Correct 996 ms 119416 KB Output is correct
34 Correct 1720 ms 225440 KB Output is correct
35 Correct 2290 ms 327760 KB Output is correct
36 Correct 2864 ms 428016 KB Output is correct
37 Correct 1765 ms 121968 KB Output is correct
38 Correct 2419 ms 227620 KB Output is correct
39 Correct 2805 ms 332692 KB Output is correct
40 Correct 3107 ms 433068 KB Output is correct
41 Correct 1801 ms 119808 KB Output is correct
42 Correct 2426 ms 224280 KB Output is correct
43 Correct 2807 ms 325112 KB Output is correct
44 Correct 3134 ms 425332 KB Output is correct
45 Correct 2013 ms 119188 KB Output is correct
46 Correct 2726 ms 225528 KB Output is correct
47 Correct 3074 ms 326140 KB Output is correct
48 Correct 3233 ms 427888 KB Output is correct