이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#define pb push_back
#define ii pair<int,int>
#define all(x) (x).begin(),(x).end()
#define sz(x) ((int)(x).size())
#define INF 100000000000000000
#define int long long int
using namespace std;
#define rand() (rand() * rand() + rand() + 1)
 
class BigInt{
public:
	int sign;
	string s;
	BigInt() : s("") {}
	BigInt(string x){
		*this = x;
	}
	BigInt(int x){
		*this = to_string(x);
	}
	BigInt negative(){
		BigInt x = *this;
		x.sign *= -1;
		return x;
	}
	BigInt normalize(int newSign){
		for(int a = s.size() - 1; a > 0 && s[a] == '0'; a--)
			s.erase(s.begin() + a);
		sign = (s.size() == 1 && s[0] == '0' ? 1 : newSign);
		return *this;
	}
	void operator =(string x){
		int newSign = (x[0] == '-' ? -1 : 1);
		s = (newSign == -1 ? x.substr(1) : x);
		reverse(s.begin(), s.end());
		this->normalize(newSign);
	}
	bool operator ==(const BigInt &x) const{
		return (s == x.s && sign == x.sign);
	}
	bool operator <(const BigInt &x) const{
		if(sign != x.sign) return sign < x.sign;
		if(s.size() != x.s.size())
			return (sign == 1 ? s.size() < x.s.size() : s.size() > x.s.size());
		for(int a = s.size() - 1; a >= 0; a--) if(s[a] != x.s[a])
			return (sign == 1 ? s[a] < x.s[a] : s[a] > x.s[a]);
		return false;
	}
	bool operator <=(const BigInt &x) const{
		return (*this < x || *this == x);
	}
	bool operator >(const BigInt &x) const{
		return (!(*this < x) && !(*this == x));
	}
	bool operator >=(const BigInt &x) const{
		return (*this > x || *this == x);
	}
	BigInt operator +(BigInt x){
		BigInt curr = *this;
		if(curr.sign != x.sign) return curr - x.negative();
		BigInt res;
		for(int a = 0, carry = 0; a < s.size() || a < x.s.size() || carry; a++){
			carry += (a < curr.s.size() ? curr.s[a] - '0' : 0) + (a < x.s.size() ? x.s[a] - '0' : 0);
			res.s += (carry % 10 + '0');
			carry /= 10;
		}
		return res.normalize(sign);
	}
	BigInt operator -(BigInt x){
		BigInt curr = *this;
		if(curr.sign != x.sign) return curr + x.negative();
		int realSign = curr.sign;
		curr.sign = x.sign = 1;
		if(curr < x) return ( (x - curr).negative()).normalize(-realSign);
		BigInt res;
		for(int a = 0, borrow = 0; a < s.size(); a++){
			borrow = (curr.s[a] - borrow - (a < x.s.size() ? x.s[a] : '0'));
			res.s += (borrow >= 0 ? borrow + '0' : borrow + '0' + 10);
			borrow = (borrow >= 0 ? 0 : 1);
		}
		return res.normalize(realSign);
	}
	BigInt operator *(BigInt x){
		BigInt res("0");
		for(int a = 0, b = s[a] - '0'; a < s.size(); a++, b = s[a] -'0'){
			while(b--) res = (res + x);
			x.s.insert(x.s.begin(), '0');
		}
		return res.normalize(sign * x.sign);
	}
	BigInt operator /(BigInt x){
		if(x.s.size() == 1 && x.s[0] == '0') x.s[0] /= (x.s[0] - '0');
		BigInt temp("0"), res;
		for(int a = 0; a < s.size(); a++)
			res.s += "0";
		
		int newSign = sign * x.sign;
		x.sign = 1;
		for(int a = s.size() - 1; a >= 0; a--){
			temp.s.insert(temp.s.begin(), '0');
			temp = temp + s.substr(a, 1);
			while(!(temp < x)){
				temp = temp - x;
				res.s[a]++;
			}
		}
		return res.normalize(newSign);
	}
	BigInt operator %(BigInt x){
		if(x.s.size() == 1 && x.s[0] == '0') x.s[0] /= (x.s[0] - '0');
		BigInt res("0");
		x.sign = 1;
		for(int a = s.size() - 1; a >= 0; a--){
			res.s.insert(res.s.begin(), '0');
			res = res + s.substr(a, 1);
			while(!(res < x))
				res = res - x;
		}
		return res.normalize(sign);
	}
	// operator string(){
	// 	string ret = s;
	// 	reverse(ret.begin(), ret.end());
	// 	return (sign == -1 ? "-" : "") + s;
	// }
	string toString() const{
		string ret = s;
		reverse(ret.begin(), ret.end());
		return (sign == -1 ? "-" : "") + ret;
	}
	BigInt toBase10(int base){
		BigInt exp(1), res("0"), BASE(base);
		
		for(int a = 0; a < s.size(); a++){
			int curr = (s[a] < '0' || s[a] > '9' ? (toupper(s[a]) - 'A' + 10) : (s[a] - '0'));
			res = res + (exp * BigInt(curr));
			exp = exp * BASE;
		}
		return res.normalize(sign);
	}
	BigInt toBase10(int base, BigInt mod){
		BigInt exp(1), res("0"), BASE(base);
		
		for(int a = 0; a < s.size(); a++){
			int curr = (s[a] < '0' || s[a] > '9' ? (toupper(s[a]) - 'A' + 10) : (s[a] - '0'));
			res = (res + ((exp * BigInt(curr) % mod)) % mod);
			exp = ((exp * BASE) % mod);
		}
		return res.normalize(sign);
	}
	string convertToBase(int base){
		BigInt ZERO(0), BASE(base), x = *this;
		string modes = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
		if(x == ZERO)
			return "0";
		string res = "";
		while(x > ZERO){
			BigInt mod = x % BASE;
			x = x - mod;
			if(x > ZERO)
				x = x / BASE;
			res = modes[stoi(mod.toString())] + res;
		}
		return res;
	}
	BigInt toBase(int base){
		return BigInt(this->convertToBase(base));
	}
	friend ostream &operator <<(ostream &os, const BigInt &x){
		os << x.toString();
		return os;
	}
};
struct Node{
 
	int left, right;
	int key;
	int prior;
	BigInt sum = 0, val = 0;  
	int lazy;
	Node(int k = 0){
		left = right = key = prior = lazy = 0;
		key = k;
	}
	bool operator<(Node& A){
		return key < A.key;
	}
	bool operator==(Node& A){
		return key == A.key;
	}
 
};
 
vector<Node> node;
 
namespace Treap{
 
	int root = 0;
	int ind = 1;
 
	int new_node(){
		return ind++;
	}
	void push(int j){
		if(!j) return;
		int l = node[j].left;
		int r = node[j].right;
		node[j].key += node[j].lazy;
		if(l){
			node[l].lazy += node[j].lazy;
		}
		if(r){
			node[r].lazy += node[j].lazy;
		}
		node[j].lazy = 0;
	}
	void print(int j){
		if(!j)return;
		push(j);
		int l = node[j].left;
		int r = node[j].right;
		if(l){
			print(l);
		}
		if(r){
			print(r);
		}
	}
	void up(int j){
		if(!j) return;
		int l = node[j].left;
		int r = node[j].right;
		node[j].sum = node[l].sum + node[r].sum + node[j].val;
	}
	void split(int j, Node v, int& l, int& r){
		push(j);
		if(!j) l = r = 0;
		else if(node[j] < v){
			split(node[j].right, v, node[j].right, r);
			l = j;
		}
		else{
			split(node[j].left, v, l, node[j].left);
 
			r = j;
 
		}
		
		push(j);
		push(node[j].left);
		push(node[j].right);
		up(j);
 
	}
	void merge(int& j, int l, int r){
		push(l);
		push(r);
		if(!l || !r) j = max(l, r);
		else if(node[l].prior > node[r].prior){
			merge(node[l].right, node[l].right, r);
			j = l;
		} 
		else{
			merge(node[r].left, l, node[r].left);
			j = r;
		}
		push(j);
		push(node[j].left);
		push(node[j].right);
		up(j);
	}
	void insert(int& j, int i){
		push(j);
		if(!j) j = i;
		else if(node[i].prior > node[j].prior){
			split(j, node[i], node[i].left, node[i].right);
			j = i;
		}
		else {
			if(node[i] < node[j]) insert(node[j].left, i);
			else insert(node[j].right, i);
		}
 		push(j);
		push(node[j].left);
		push(node[j].right);
		up(j);
 
	}
	
	int erase(int& j, Node v){
		push(j);
		if(node[j] == v) {
			int ret = j;
			merge(j, node[j].left, node[j].right);
			return ret;
		}
		else{
			if(v < node[j]) return erase(node[j].left, v);
			else return erase(node[j].right, v);
		}
		
		push(node[j].left);
		push(node[j].right);
		up(j);
	}
 
	int add(int v, BigInt t){
		int j = new_node();
		node[j].key = v;
		node[j].prior = rand();
		node[j].sum = node[j].val = t;
		insert(root, j);
		return j;
	}
	int leftmost(int j){
		if(node[j].left) return leftmost(node[j].left);
		return j;
	}
 
 
	void update(int j, BigInt v){
 		
 		int l = 2, r = j;
 		while(l <= r){
 			int m = (l + r) / 2;
 			int tl, tr;
 			split(root, Node(m), tl, tr);
 			if(node[tl].sum < v - 1){
 				l = m + 1;
 			}
 			else if(node[tl].sum == v - 1){
 				root = tl;
 				add(tr ? node[leftmost(tr)].key : j, v);
 				if(tr) node[tr].lazy++;
 				merge(root, root, tr);
 				return;
 			}
 			else r = m - 1;
 			merge(root, tl, tr); 
 		}
 		node[root].lazy++;
 		add(1, v);
	}
	
	void dfs(int j){
		push(j);
		int l = node[j].left;
		int r = node[j].right;
		if(l) dfs(l);
		if(r) dfs(r);
		up(j);
	}
}
int32_t main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	
	int n;
	cin >> n;
	node = vector<Node> (n + 1);
	BigInt last = 0;
	for(int i = 1; i <= n; i++){
		string t;
		cin >> t;
		BigInt x(t);
		Treap::update(i, x - last);
		last = x;
	}
	Treap::dfs(Treap::root);
	for(int i = 1; i <= n; i++) cout << node[i].key << " ";
}
컴파일 시 표준 에러 (stderr) 메시지
permutation.cpp: In member function 'BigInt BigInt::operator+(BigInt)':
permutation.cpp:89:31: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |   for(int a = 0, carry = 0; a < s.size() || a < x.s.size() || carry; a++){
      |                             ~~^~~~~~~~~~
permutation.cpp:89:47: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |   for(int a = 0, carry = 0; a < s.size() || a < x.s.size() || carry; a++){
      |                                             ~~^~~~~~~~~~~~
permutation.cpp:90:16: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   90 |    carry += (a < curr.s.size() ? curr.s[a] - '0' : 0) + (a < x.s.size() ? x.s[a] - '0' : 0);
      |              ~~^~~~~~~~~~~~~~~
permutation.cpp:90:60: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   90 |    carry += (a < curr.s.size() ? curr.s[a] - '0' : 0) + (a < x.s.size() ? x.s[a] - '0' : 0);
      |                                                          ~~^~~~~~~~~~~~
permutation.cpp: In member function 'BigInt BigInt::operator-(BigInt)':
permutation.cpp:113:32: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  113 |   for(int a = 0, borrow = 0; a < s.size(); a++){
      |                              ~~^~~~~~~~~~
permutation.cpp:114:38: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  114 |    borrow = (curr.s[a] - borrow - (a < x.s.size() ? x.s[a] : '0'));
      |                                    ~~^~~~~~~~~~~~
permutation.cpp: In member function 'BigInt BigInt::operator*(BigInt)':
permutation.cpp:127:36: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  127 |   for(int a = 0, b = s[a] - '0'; a < s.size(); a++, b = s[a] -'0'){
      |                                  ~~^~~~~~~~~~
permutation.cpp: In member function 'BigInt BigInt::operator/(BigInt)':
permutation.cpp:141:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  141 |   for(int a = 0; a < s.size(); a++)
      |                  ~~^~~~~~~~~~
permutation.cpp: In member function 'BigInt BigInt::toBase10(long long int)':
permutation.cpp:199:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  199 |   for(int a = 0; a < s.size(); a++){
      |                  ~~^~~~~~~~~~
permutation.cpp: In member function 'BigInt BigInt::toBase10(long long int, BigInt)':
permutation.cpp:212:20: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  212 |   for(int a = 0; a < s.size(); a++){
      |                  ~~^~~~~~~~~~| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |