답안 #7228

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
7228 2014-07-28T11:51:27 Z Rhak 게임 (IOI13_game) C++
0 / 100
0 ms 1216 KB
#include "game.h"

long long gcd2(long long x, long long y){ return y==0? x: gcd2(y, x%y); }

struct _node{
	_node *left, *right;
	long long GCD;
	_node(long long GCD):GCD(GCD){ left = right = 0; }
};

struct _IndexTree{
	int S, E;
	_node *root;
	_IndexTree(int S,int E):S(S), E(E){ root = new _node(0);}
	void update(_node* n, int s, int e, int p, long long N)
	{
		if( p < s || e < p) return;
		else if( p == s && e == p){
			n->GCD = N;
			return;
		}
		int m = (s+e) >> 1;
		long long t1 = n->left? n->left->GCD:0, t2 = n->right? n->right->GCD:0;
		if( p <= m ){
			if( !n->left ) n->left = new _node(0);
			update(n->left, s, m, p, N);
			t1 = n->left->GCD;
		}
		else{
			if( !n->right ) n->right = new _node(0);
			update(n->right, m+1, e, p, N);
			t2 = n->right->GCD;
		}
		n->GCD = gcd2(t1,t2);
	}
	void update(int p, long long N)
	{
		update(root, S, E, p, N);
	}

	long long read(_node *n, int s, int e, int p, int q)
	{
		if( !n ) return 0;
		if( q < s || e < p) return 0;
		else if( p <= s && e <= q){
			return n->GCD;
		}
		int m = (s+e) >> 1;
		long long t1 = n->left? read(n->left, s, m, p, q):0;
		long long t2 = n->right? read(n->right, m+1, e, p, q):0;
		return gcd2(t1, t2);
	}

	long long read(int s,int e){
		return read(root, S, E, s, e);
	}
};

struct node{
	node *left, *right;
	_IndexTree *IT;
	node(int C){
		left = right = 0;
		IT = new _IndexTree(0, C-1);
	}
};

struct IndexTree{
	int S, E, C;
	node* root;
	IndexTree(int S, int E, int C):S(S), E(E), C(C){
		root = new node(C);
	}
	
	void update(node* n, int s, int e, int p, int q, long long N)
	{
		if( p < s || e < p) return;	
		n->IT->update(q, N);
		if( p == s && e == p) return;
		int m = (s+e) >> 1;
		if( p <= m ){
			if( !n->left ) n->left = new node(C);
			update(n->left, s, m, p, q, N);
		}
		else{
			if( !n->right ) n->right = new node(C);
			update(n->right, m+1, e, p, q, N);
		}
	}
	void update(int p, int q, long long N)
	{
		update(root, S, E, p, q, N);
	}

	long long read(node *n, int s, int e, int p, int q, int u, int v)
	{
		if( !n ) return 0;
		if( q < s || e < p) return 0;
		else if( p <= s && e <= q){
			return n->IT->read(u, v);
		}
		int m = (s+e) >> 1;
		long long t1 = n->left? read(n->left, s, m, p, q, u, v):0;
		long long t2 = n->right? read(n->right, m+1, e, p, q, u, v):0;
		return gcd2(t1, t2);
	}
	long long read(int P,int Q,int U, int V)
	{
		return read(root, S, E, P, Q, U, V);
	}
}*IT;

void init(int R, int C){
	IT = new IndexTree(0, R-1, C);
}

void update(int R, int C, long long K){
	IT->update(R, C, K);
}

long long calculate(int P, int Q, int U, int V){
	return IT->read(P, U, Q, V);
}
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 1216 KB Output is correct
2 Incorrect 0 ms 1216 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 1216 KB Output is correct
2 Incorrect 0 ms 1216 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 1216 KB Output is correct
2 Incorrect 0 ms 1216 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 1216 KB Output is correct
2 Incorrect 0 ms 1216 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 1216 KB Output is correct
2 Incorrect 0 ms 1216 KB Output isn't correct
3 Halted 0 ms 0 KB -