A
啊这,n方能过,白用nlog了,还好有板子
hhhhhhhhhh
#include<iostream> #include<sstream> #include<fstream> #include<iomanip> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<queue> #include<stack> #include<vector> #include<string> #include<map> #include<set> #include<ctime> #include<bitset> #include<iterator> #define bug cout<<"-----------"<<endl; #define ll long long #define ull unsigned long long #define pb push_back #define mp make_pair #define pi pair<int, int> #define fi first #define se second using namespace std; const int N=1e5+5,M=1e9+7; const ull base=13331; const double Pi=acos(-1.0); const int inf=0x3f3f3f3f; inline 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*10+ch-'0';ch=getchar();} return x*f; } int a[N],b[N]; struct node{ int l,r; int val,id; #define l(x) tree[x].l #define r(x) tree[x].r #define val(x) tree[x].val #define id(x) tree[x].id }tree[N*4]; void up(int p){ if(val(p<<1)>=val(p<<1|1)){ val(p)=val(p<<1); id(p)=id(p<<1); } else{ val(p)=val(p<<1|1); id(p)=id(p<<1|1); } } void build(int p,int l,int r){ l(p)=l,r(p)=r; if(l==r){val(p)=a[l],id(p)=l;return;} int mid=((l+r)>>1); build(p<<1,l,mid); build(p<<1|1,mid+1,r); up(p); } int n; int quaryr(int p,int l,int r,int val){ if(r(p)<l||l(p)>r)return n+1; int mid=((l(p)+r(p))>>1),ans=n+1; if(l(p)>=l&&r(p)<=r){ if(l(p)==r(p)&&val(p)>val)return id(p); if(val(p<<1)>val)return quaryr(p<<1,l,r,val); if(val(p<<1|1)>val)return quaryr(p<<1|1,l,r,val); return n+1; } ans=min(ans,quaryr(p<<1,l,r,val)); if(ans!=n+1)return ans; ans=min(ans,quaryr(p<<1|1,l,r,val)); return ans; } int main(){ ios::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; } build(1,1,n); for(int i=n-1;i>=1;i--){ int x=quaryr(1,i+1,n,a[i]); if(x==n+1)x=0; b[i]=x; } for(int i=1;i<=n;i++){ cout<<b[i]; if(i==n)cout<<endl; else cout<<' '; } }