题解:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<cmath>
#include<queue>
#define ll long long
#define pr make_pair
#define pb push_back
#define lc (cnt<<1)
#define rc (cnt<<1|1)
using namespace std;
const int inf=0x3f3f3f3f;
const ll lnf=0x3f3f3f3f3f3f3f3f;
const double dnf=1e15;
const int mod=1e9+7;
const double eps=1e-8;
const int maxn=500100;
struct node
{
int l,r;
int maxx,maxl,se,cnt;
int addmaxx,addmaxl,addse,addsel;
ll sum;
}t[maxn<<2];
int a[maxn];
void pushup(int cnt)
{
t[cnt].maxx=max(t[lc].maxx,t[rc].maxx);
t[cnt].maxl=max(t[lc].maxl,t[rc].maxl);
t[cnt].sum=t[lc].sum+t[rc].sum;
if(t[lc].maxx==t[rc].maxx)
{
t[cnt].cnt=t[lc].cnt+t[rc].cnt;
t[cnt].se=max(t[lc].se,t[rc].se);
}
else if(t[lc].maxx>t[rc].maxx)
{
t[cnt].cnt=t[lc].cnt;
t[cnt].se=max(t[lc].se,t[rc].maxx);
}
else
{
t[cnt].cnt=t[rc].cnt