Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- #include <ext/pb_ds/assoc_container.hpp> // Common file
- #include <ext/pb_ds/tree_policy.hpp>
- using namespace std;
- using namespace __gnu_pbds;
- //#define CHKR
- #define ll long long
- #define pb push_back
- //#define mp make_pair
- #define fr first
- #define sc second
- #define ARRS int(2e5+500)
- #define BARRS int(6e4+600)
- #define MAX ((long long)(1e9+1))
- #define EP ((double)(1e-12))
- #define MMAX ((long long)(1e9+10))
- #define HS1 ((long long)(1000001329))
- #define HS2 ((long long)(1000001531))
- #define MOD ((long long)1000000000ll)
- #define SQ 31622780
- #define PI 3.14159265358979323846264338327950288419716939937510
- #define BG 4294967232ll
- #define MH 200008
- typedef tree<ll, null_type, less<ll>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
- ordered_set s;
- pair<ll,ll> a[ARRS];
- pair<ll,ll> b[ARRS];
- vector<ll> v[ARRS];
- ll pr[ARRS];
- ll m;
- ll bld(ll x){
- ll c=x+1;
- while(c<m&&a[c].sc<=a[x].sc){
- // cout<<x<<" <> "<<c<<endl;
- // if(a[c].sc>a[x].sc){
- // assert(0);
- // exit(5);
- // }
- v[x].pb(c);
- c=bld(c);
- }
- if(c-1==x){
- for(int i=a[x].fr; i<=a[x].sc; i++)
- pr[i]=x;
- }
- else {
- //cout<<a[x].fr<<" "<<a[x+1].fr<<" "<<
- for(int i=a[x].fr; i<a[x+1].fr; i++)
- pr[i]=x;
- for(int i=a[c-1].sc+1; i<=a[x].sc; i++)
- pr[i]=x;
- }
- return c;
- }
- ll in[ARRS];
- ll out[ARRS];
- ll dt[ARRS];
- vector<pair<ll,ll> > lca;
- void go(ll x,ll d){
- in[x]=lca.size();
- dt[x]=d;
- for(auto y:v[x]){
- lca.pb({d,x});
- go(y,d+1);
- }
- out[x]=lca.size();
- lca.pb({d,x});
- }
- pair<ll,ll> rq[ARRS][23];
- void blrq(){
- ll n=lca.size();
- for(int i=n-1; i>=0; i--){
- rq[i][0]=lca[i];
- for(int t=0; t<19; t++)
- rq[i][t+1]=min(rq[i][t],rq[min(n-1,0ll+i+(1<<t))][t]);
- }
- }
- ll lg2[ARRS];
- ll mamaa(ll l,ll r){
- ll k=lg2[r-l]-1;
- return min(rq[l][k],rq[r+1-(1<<k)][k]).sc;
- }
- ll caaa(ll l,ll r){
- if(l>r)swap(l,r);
- if(l==r)return l;
- if(out[r]<=out[l])return l;
- return mamaa(out[l],in[r]);
- }
- set<ll> ss;
- #ifndef CHKR
- int main(){
- #else
- int doit(fstream &in,fstream &out){
- cin.rdbuf(in.rdbuf());
- //cout.rdbuf(out.rdbuf());
- #endif
- #ifdef KHOKHO
- #ifndef CHKR
- freopen("in.in","r",stdin);
- freopen("out.out","w+",stdout);
- #endif //CHKR
- #endif //KHOKHO
- lg2[0]=0;
- for(int i=1; i<ARRS-10; i++){
- lg2[i]=lg2[i-1];
- if((i&(i-1))==0){lg2[i]++;}
- //cout<<lg2[i]<<endl;
- }
- lg2[0]=0;
- // return 0;
- ll n,R,t;
- cin>>n>>m>>R;
- for(int i=0; i<n-1; i++){
- cin>>t;
- if(t>=R)ss.insert(i);
- }
- s.insert(-1);
- for(int i=0; i<=n; i++){
- s.insert(i);
- }
- ll l,r,sl, q=0;
- ll po=0;
- for(int i=0; i<m; i++){
- cin>>l>>r;
- ll t=r-l;
- po+=t;
- l++;
- sl=l;
- r++;
- l=*s.find_by_order(l-1)+1;
- r=*s.find_by_order(r);
- while(t--)s.erase(s.find_by_order(sl));
- // for(auto it=s.begin(); it!=s.end(); it++){
- // cout<<*it<<" ";
- // }
- //cout<<endl;
- a[i]={l,-r};
- //cout<<i<<" "<<l<<" "<<r<<endl;
- }
- cout<<"PO: "<<po<<endl;
- sort(a,a+m);
- for(int i=0; i<m; i++){
- a[i].sc*=-1;
- }
- // cout<<endl;
- for(int i=0; i<m; i++){
- cout<<a[i].fr<<" "<<a[i].sc<<endl;
- }
- bld(0);
- // for(int i=0; i<n; i++){
- // cout<<pr[i]<<" ";
- // }
- // cout<<endl;
- go(0,0);
- blrq();
- // for(int i=0; i<lca.size(); i++){
- // cout<<lca[i].fr<<" "<<lca[i].sc<<" / ";
- // }
- // cout<<endl;
- // cout<<endl;
- // cout<<endl;
- // cout<<caaa(1,3)<<endl;
- // cout<<endl;
- ///return 0;
- pair<ll,ll> pas={0,0};
- for(int i=0; i<n; i++){
- ll t;
- auto it=ss.lower_bound(i);
- ll k=MAX;
- // for(auto it:ss){
- // if((it)>=i){
- // t=caaa(pr[(it)+1],pr[i]);
- // } else {
- // t=caaa(pr[it],pr[i]);
- // }
- // cout<<i<<" "<<it<<" "<<t<<" "<<dt[t]<<" "<<dt[pr[i]]<<" "<<dt[pr[i]]-dt[t]<<endl;
- // k=min(k,dt[pr[i]]-dt[t]);
- // }
- if(it!=ss.end()){
- t=caaa(pr[(*it)+1],pr[i]);
- cout<<(*it)+1<<" "<<dt[pr[i]]<<" = "<<dt[t]<<endl;
- k=min(k,dt[pr[i]]-dt[t]);
- //pas=max(pas,);
- }
- if(it!=ss.begin()){
- it--;
- cout<<(*it)<<" "<<pr[i]<<" = "<<caaa(pr[*it],pr[i])<<endl;
- t=caaa(pr[*it],pr[i]);
- k=min(k,dt[pr[i]]-dt[t]);
- }
- cout<<i<<" "<<k<<endl;
- pas=max(pas,{k,-i});
- }
- cout<<-pas.sc;
- return 0;
- }
- //
- //
- //#include<bits/stdc++.h>
- //using namespace std;
- //int a,s,d[100002],d1[100002][2],f,g,h,j,k,l,i,n,m,ans,pos;
- //vector<int> v1[200002];
- //
- //int pr1[19][200003],pas[200003],lv1[200002];
- //struct tre{
- // int val;
- // int shep;
- // tre *L;
- // tre *R;
- // tre(){
- // val=0;
- // shep=-1;
- // L=NULL;
- // R=NULL;
- // }
- //};
- //
- //void shd(tre *&it,int rd){
- // if(rd==1) {it->shep=-1;return;}
- // if(!it->L) it->L=new tre();
- // if(!it->R) it->R=new tre();
- // it->L->shep=it->shep;
- // it->R->shep=it->shep;
- // it->L->val=rd/2*it->shep;
- // it->R->val=(rd-rd/2)*it->shep;
- // it->shep=-1;
- // return;
- //}
- //
- //void add(tre *&it,int l,int r,int lf,int rg,int val){
- // if(l>=rg || r<=lf) return;
- // if(!it) it=new tre();
- // if(l>=lf && r<=rg) {
- // it->shep=val;
- // it->val=(r-l)*val;
- // return;
- // }
- // if(it->shep!=-1) shd(it,r-l);
- // add(it->L,l,(l+r)/2,lf,rg,val);
- // add(it->R,(l+r)/2,r,lf,rg,val);
- // it->val=(it->L ? it->L->val : 0)+(it->R ? it->R->val : 0);
- // //cout<<">>"<<l<<" "<<r<<" "<<it->val<<endl;
- //}
- //
- //int fnd(tre *&it,int l,int r,int val){//cout<<l<<" "<<r<<" "<<val<<" :"<<it->val<<endl;
- // if(it->shep!=-1) return l+val-1;
- // if(l+1==r) return l;
- // int y=it->L ? it->L->val : 0;
- // if(y>=val) return fnd(it->L,l,(l+r)/2,val);
- // else return fnd(it->R,(l+r)/2,r,val-y);
- //}
- //tre *lf;
- //
- //////////////////////////////////////////
- //
- //
- //void upd(int l,int r,int pr){
- // for(int i=l;i<r;i=d1[i][1]){//cout<<i;
- // //cout<<" "<<d1[i][0]<<" "<<pr<<endl;
- // v1[pr].push_back(d1[i][0]);
- // }
- //}
- //
- //void df1(int idx,int lv){
- // lv1[idx]=lv;
- // for(auto it:v1[idx]){
- // pr1[0][it]=idx;
- // df1(it,lv+1);
- // }
- //}
- //
- //
- //int lca(int i1,int i2){//cout<<i1<<" "<<i2<<endl;
- // int i,ret=lv1[i1];
- // if(lv1[i1]<lv1[i2]) {swap(i1,i2);}
- // i=18;
- // while(lv1[i1]>lv1[i2]){
- // for(;i>=0;i--){
- // if(pr1[i][i1]!=-1 && lv1[pr1[i][i1]]>=lv1[i2]) {i1=pr1[i][i1];break;}
- // }//cout<<i1<<" "<<i2<<endl;
- // if(!i) break;
- // }//cout<<endl;
- //
- // while(i1!=i2){
- // for(;i>0;i--){
- // if(pr1[i][i1]!=pr1[i][i2]) break;
- // }//cout<<i<<"&";
- // i1=pr1[i][i1];
- // i2=pr1[i][i2];
- // }//cout<<i1<<" "<<ret<<endl<<endl;
- // return ret-lv1[i1];
- //}
- //
- //int main(){
- //
- // #ifdef KHOKHO
- // #ifndef CHKR
- // freopen("in.in","r",stdin);
- // freopen("out.out","w+",stdout);
- // #endif //CHKR
- // #endif //KHOKHO
- // //lv1[0]=-1;
- // memset(pr1,~0,sizeof pr1);
- // cin>>n>>m>>k;
- // d1[0][1]=1;
- // for(i=0;i<n-1;i++){
- // scanf("%d",&d[i]);
- // d1[i+1][0]=i+1;
- // d1[i+1][1]=i+2;
- // }
- // h=n;j=n;
- // add(lf,0,n,0,n,1);
- // vector<pair<int,int> > va;
- // for(i=0;i<m;i++){
- // scanf("%d%d",&a,&s);
- // a++;s++;
- // f=fnd(lf,0,n,a);
- // g=fnd(lf,0,n,s);
- // //cout<<f<<" "<<g<<endl;
- // va.push_back({f,-g});
- // add(lf,0,n,f+1,g+1,0);
- // //cout<<"*"<<f<<" "<<g<<endl;
- //
- // upd(f,g+1,h);
- // d1[f][0]=h;
- // h++;
- // d1[f][1]=d1[g][1];
- // }
- // sort(va.begin(),va.end());
- // for(auto t:va){
- // cout<<t.first<<" "<<-t.second<<endl;
- // }
- //
- // df1(h-1,0);
- //
- //
- // for(i=1;i<18;i++){
- // for(a=0;a<h;a++){
- // if(pr1[i-1][a]==-1) continue;
- //
- // pr1[i][a]=pr1[i-1][pr1[i-1][a]];
- // }
- // }
- // f=h-1;
- // for(i=0;i<n;i++){
- // pas[i]=lca(i,f);
- // //cout<<lv1[i]<<endl;
- // if(d[i]>k) f=i;
- // }
- // f=j-1;
- // for(i=n-1;i>=0;i--){
- // g=lca(i,f+1);
- // //cout<<pas[i]<<"| "<<g<<endl;
- // pas[i]=min(pas[i],g);
- // if(ans<=pas[i]){ans=pas[i];pos=i;}
- // if(d[i-1]>k) f=i-1;
- // }
- // if(k!=n-1) ans--;
- // cout<<pos;
- //}
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement