Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Author of solution {
- gskhirtladze;
- }
- */
- #include <iostream>
- #include <stdio.h>
- #include <math.h>
- #include <algorithm>
- #include <string>
- #include <vector>
- #include <map>
- #include <queue>
- #include <string>
- #define fi first
- #define se second
- #define pb push_back
- #define mk make_pair
- #define Pii pair < int , int >
- #define tree int t,int l,int r
- #define left 2*t,l,(l+r)/2
- #define right 2*t+1,(l+r)/2+1,r
- #define f_sum(i,r) for (int i=r;i>=0;i=(i&(i+1))-1)
- #define f_upd(i,a,r) for (int i=a;i<=r;i=(i|(i+1)))
- #define MA(a,b) ((a)>(b)?(a):(b))
- #define MI(a,b) ((a)<(b)?(a):(b))
- #define AB(a) (-(a)<(a)?(a):-(a))
- #define ged(x) scanf("%I64d",&x)
- #define getcx getchar//_unlocked
- #define put(x) cout<<x<<endl;
- #define pud(x) printf("%.12f\n",x);
- #define LL long long
- #define INF 1000000000
- #define eps 0.00000001
- #define P7 1000000007
- #define P9 1000000009
- #define N3 2555
- #define N5 262145
- using namespace std;
- inline void inp(int &n )
- {n=0; int ch=getcx();int sign=1;
- while(ch<'0'||ch>'9'){if(ch=='-')sign=-1; ch=getcx();}
- while( ch >= '0' && ch <= '9' ) n=(n<<3)+(n<<1)+ch-'0',ch=getcx();
- n=n*sign;}
- int tst;
- void get_ready() {
- //freopen(".in","r",stdin);
- //freopen(".out","w",stdout);
- tst=1; //inp(tst);
- }
- int mi[N5],ma[N5],tr[N5],ans[N5],a[N5],la,mii,maa;
- void build (tree)
- {
- if (l == r)
- {
- ma[t]=a[l];
- mi[t]=a[l];
- return ;
- }
- build (left);
- build (right);
- ma[t]=MA(ma[2*t],ma[2*t+1]);
- mi[t]=MI(mi[2*t],mi[2*t+1]);
- }
- void get_mi(tree,int L,int R)
- {
- if (l > R || L > r) return;
- if (L <= l && r <= R) { la=MI(la,tr[t]); return; }
- get_mi(left,L,R);
- get_mi(right,L,R);
- }
- void get_m(tree,int L,int R)
- {
- if (l > R || L > r) return;
- if (L <= l && r <= R) { mii=MI(mii,mi[t]); maa=MA(maa,ma[t]); return; }
- get_m(left,L,R);
- get_m(right,L,R);
- }
- void upd_mi(tree,int i,int la)
- {
- if (l > i || i > r) return;
- if (l == r) { tr[t]=la; return; }
- upd_mi(left,i,la);
- upd_mi(right,i,la);
- tr[t]=MI(tr[2*t],tr[2*t+1]);
- }
- int n,s,L,i;
- main()
- {
- cin>>n>>s>>L;
- for (i=1;i<=n;i++)
- cin>>a[i];
- build(1,1,n);
- for (i=1;i<=n;i++)
- {
- int l=1,r=i,m=0,mid=-1;
- while (l <= r)
- {
- m=(l+r)/2;
- mii=INF;
- maa=-INF;
- get_m(1,1,n,m,i);
- if (maa-mii <= s) { mid=m; r=m-1; } else l=m+1;
- }
- mid=mid-1;
- la=INF;
- get_mi(1,0,n,mid,i-L);
- upd_mi(1,0,n,i,la+1);
- ans[i]=la+1;
- }
- if (ans[n] >= INF) ans[n]=-1;
- cout<<ans[n]<<endl;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement