Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long int ll;
- #define N ((int)(1e5 + 5))
- #define MAX ((int)(1e7 + 5))
- struct info
- {
- int h, i;
- } ar[N];
- bool cmp1(info a, info b)
- {
- return (a.h>b.h || (a.h==b.h && a.i>b.i));
- }
- bool cmp2(info a, info b)
- {
- return (a.h>b.h || (a.h==b.h && a.i<b.i));
- }
- bool cmp(info a, info b)
- {
- return a.i<b.i;
- }
- int sum[N*4], mn[N*4];
- void init(int n, int b, int e)
- {
- sum[n] = 0;
- if(b==e)
- {
- mn[n] = ar[b].h;
- return;
- }
- int l, m;
- l = n<<1;
- m = (b+e)>>1;
- init(l,b,m);
- init(l+1,m+1,e);
- mn[n] = min(mn[l],mn[l+1]);
- }
- int getid(int n, int b, int e, int i, int j, bool dir)
- {
- if(sum[n]==0 || e<i || j<b || i>j)
- {
- if(dir==1) return N;
- else return -1;
- }
- if(b==e) return b;
- int l,m;
- l = n<<1;
- m = (b+e)>>1;
- if(i<=b && j>=e)
- {
- if(dir)
- {
- if(sum[l+1]>0) return getid(l+1,m+1,e,i,j,dir);
- else return getid(l,b,m,i,j,dir);
- }
- else
- {
- if(sum[l]>0) return getid(l,b,m,i,j,dir);
- else return getid(l+1,m+1,e,i,j,dir);
- }
- }
- if(dir==0) return max(getid(l,b,m,i,j,dir),getid(l+1,m+1,e,i,j,dir));
- return min(getid(l+1,m+1,e,i,j,dir),getid(l,b,m,i,j,dir));
- }
- void update(int n, int b , int e, int i)
- {
- if(i<b || i>e) return;
- if(b==e){
- sum[n]++;
- return;
- }
- int l , m;
- l = n<<1;
- m = (b+e)>>1;
- update(l,b,m,i);
- update(l+1,m+1,e,i);
- sum[n] = sum[l]+sum[l+1];
- }
- int getmin(int n, int b, int e, int i, int j)
- {
- if(j<b || e<i || i>j) return MAX;
- if(i<=b && j>=e) return mn[n];
- int l, m;
- m = (b+e)>>1;
- l = n<<1;
- return min(getmin(l,b,m,i,j),getmin(l+1,m+1,e,i,j));
- }
- int ans[N];
- int main()
- {
- int n;
- while(!scanf("%d",&n)!=-1)
- {
- for(int i = 1; i<=n ; i++)
- {
- scanf("%d",&ar[i].h);
- ar[i].i = i;
- ans[i] = ar[i].h;
- }
- init(1,1,n);
- sort(ar+1,ar+n+1,cmp1);
- for(int i = 1; i<=n; i++)
- {
- int j = ar[i].i;
- int k = getid(1,1,n,1,j,0);
- if(k<1) continue;
- ans[j] = min(ans[j],getmin(1,1,n,k,j));
- update(1,1,n,j);
- }
- memset(sum,0,sizeof sum);
- sort(ar+1,ar+1+n, cmp2);
- for(int i = 1; i<=n; i++)
- {
- int j = ar[i].i;
- int k = getid(1,1,n,j,n,1);
- if(k>n) continue;
- ans[j] = max(ans[j],getmin(1,1,n,j,k));
- }
- sort(ar+1,ar+1+n,cmp);
- for(int i = 1; i<=n; i++)
- {
- if(ar[i].h-ans[i]>=150000) printf("%d ",i);
- }
- printf("\n");
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement