笛卡尔树

小根堆

#include<bits/stdc++.h>
#define int long long
using namespace std;
constexpr int maxn=1e7+10;
int read()
{
    int x=0,f=1;
    char ch=getchar();
    while (ch<'0' || ch>'9')
    {
        if (ch == '-') f=-1;
        ch=getchar();
    }
    while (ch>='0' && ch<='9')
    {
        x=(x<<1)+(x<<3)+ch-'0';
        ch=getchar();
    }
    return x*f;
}
int n,a[maxn],stk[maxn],top=1,ls[maxn],rs[maxn];
void des()
{
    for (int i=2;i<=n;i++)
    {
        while (a[stk[top]]>a[i] && top) top--;
        if (!top) ls[i]=stk[top+1];
        else ls[i]=rs[stk[top]],rs[stk[top]]=i;
        stk[++top]=i;
    }
}
int ans1,ans2;
signed main()
{
    n=read();stk[1]=1;
    for (int i=1;i<=n;i++) a[i]=read();
    des();
    for (int i=1;i<=n;i++) ans1^=i*(ls[i]+1),ans2^=i*(rs[i]+1);
    printf("%lld %lld\n",ans1,ans2);
    return 0;
}
posted @ 2026-07-16 17:08  msjing  阅读(11)  评论(0)    收藏  举报