/**************************************************************** 
 * Description:   
 * Author: Alex Li  
 * Date: 2024-08-12 14:29:58
 * LastEditTime: 2024-08-12 14:55:18
****************************************************************/
#include<iostream>
#include <stack>
using namespace std;


#define ll long long      // 定义宏，`ll` 替换为 `long long`

int N;                    // 用于存储输入的排列长度
int a[10000007];          // 用于存储输入的排列
int ch[10000007][2];      // 用于存储笛卡尔树的左右子节点索引，`ch[i][0]` 表示左子节点，`ch[i][1]` 表示右子节点
ll lrs, rrs;              // 用于存储最终的异或结果

int main() {
    ios::sync_with_stdio(false); // 禁用C++的I/O与C的I/O同步，以提高执行速度
    cin >> N;                    // 读取排列的长度

    // 读取排列的元素
    for (int i = 1; i <= N; ++i) cin >> a[i];
    stack<int> s;  // 定义一个栈，用于辅助构建笛卡尔树
    s.push(0);     // 将索引0压入栈，作为初始值

    // 构建笛卡尔树
    for ( int i = 1; i <= N; ++i) {
       // 如果栈顶元素对应的值大于当前值，则弹出栈顶元素，并将其作为当前元素的左子节点
        while (!s.empty() && a[s.top()] > a[i]) {
            ch[i][0] = s.top();
            s.pop();
    }

    // 如果栈不为空，将当前元素作为栈顶元素的右子节点
        if (!s.empty()) ch[s.top()][1] = i;
          s.push(i);  // 将当前元素的索引压入栈
    }
     lrs = rrs = 0;
    // 计算 `lrs` 和 `rrs`
    for ( int i = 1; i <= N; ++i) {
        lrs ^= (ll)i * (ch[i][0] + 1); // 计算左子节点的异或结果
        rrs ^= (ll)i * (ch[i][1] + 1); // 计算右子节点的异或结果
    }

    // 输出结果
    cout << lrs << " " << rrs << endl;

    return 0;
}
