This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "bits/stdc++.h"
#define int long long
#define all(v) v.begin() , v.end()
#define sz(a) (int)a.size()
using namespace std;
const int N = 1e5 + 5;
struct LazySeg{
  vector<array<int,2>> seg;
  vector<int> Lazy;
 
  LazySeg(int n){
  	seg.resize(4*n+5);
  	Lazy.assign(4*n+5,0);
  	build(1,1,n);
  }
  inline array<int,2> merge(array<int,2> a,array<int,2> b){
    array<int,2> res;
    res[0]=max(a[0],b[0]);
    res[1]=0;
    if(res[0]==a[0]) res[1]+=a[1];
    if(res[0]==b[0]) res[1]+=b[1];
    return res;
  }
  inline void push(int rt, int l, int r){
  	if(Lazy[rt] == 0) return;
    int u = Lazy[rt];
    Lazy[rt] = 0;
    seg[rt][0] += u;
    if(l==r) return;
    Lazy[rt*2] += u;
    Lazy[rt*2+1] += u;
  }
  void build(int rt,int l,int r){
  	if(l==r){
  	  seg[rt]={0,1};
  	  return;
  	}
  	int m=(l+r)/2;
  	build(rt*2,l,m),build(rt*2+1,m+1,r);
  	seg[rt] = merge(seg[rt*2],seg[rt*2+1]);
  }
  void upd(int rt,int l,int r,int gl,int gr,int u){
  	push(rt,l,r);
  	if(r<gl || l>gr) return;
  	if(l>=gl && r<=gr){
  	  Lazy[rt] += u;
  	  push(rt,l,r);
  	  return;
  	}
  	int m = (l+r)/2;
  	upd(rt*2,l,m,gl,gr,u),upd(rt*2+1,m+1,r,gl,gr,u);
  	seg[rt] = merge(seg[rt*2],seg[rt*2+1]);
  }
};
struct Answer{
  vector<array<int,2>> seg,Lazy;
  Answer(int n){
  	seg.assign(4*n+5,{-1,0});
  	Lazy.assign(4*n+5,{-1,0});
  }
  inline array<int,2> merge(array<int,2> a,array<int,2> b){
    array<int,2> res;
    res[0]=max(a[0],b[0]);
    res[1]=0;
    if(res[0]==a[0]) res[1]+=a[1];
    if(res[0]==b[0]) res[1]+=b[1];
    return res;
  }
  
  inline void push(int rt, int l, int r){
    if(Lazy[rt][0] == -1) return;
    array<int,2> U = Lazy[rt];
    Lazy[rt] = {-1, 0};
    seg[rt] = merge(seg[rt],U);
    if(l==r) return;
    Lazy[rt*2] = merge(Lazy[rt*2],U);
    Lazy[rt*2+1] = merge(Lazy[rt*2+1],U);
  }
  void upd(int rt,int l,int r,int gl,int gr,array<int,2> u){
  	push(rt,l,r);
  	if(r<gl || l>gr) return;
  	if(l>=gl && r<=gr){
  	  Lazy[rt] = merge(Lazy[rt], u);
  	  push(rt,l,r);
  	  return;
  	}
    int m = (l + r) / 2;
    upd(rt*2,l,m,gl,gr,u),upd(rt*2+1,m+1,r,gl,gr,u);
  }
  
  array<int,2> get(int rt,int l,int r,int ind){
  	push(rt,l,r);
  	if(l==r) return seg[rt];
  	int m = (l+r)/2;
  	if(ind<=m) return get(rt*2,l,m,ind);
  	else return get(rt*2+1,m+1,r,ind);
  }
};
void _(){
  int n,k,q;
  cin >> n >> k >> q;
  int a[n+5],b[n+5],c[n+5];
  for(int i=1;i<=n;i++){
  	cin >> a[i];
  	c[i] = a[i];
  }
  for(int i=1;i<=n;i++) cin >> b[i];
  
  int ind[n+5];
  for(int i=1;i<=n;i++) ind[b[i]]=i;
  
  LazySeg T(n);
  Answer Ans(q+5);
  vector<int> delta[n+5];
  
  vector<array<int,2>> Versions[n+5];
  for(int i=1;i<=n;i++) Versions[i].push_back({0,a[i]});
 
  for(int i=1;i<=q;i++){
    int ind; cin >> ind;
    delta[ind].push_back(i);
    swap(c[ind],c[ind+1]);
    Versions[ind].push_back({i,c[ind]});
    Versions[ind+1].push_back({i,c[ind+1]});
  }
  auto Get_Val = [&](int ind,int ti){
    int it = lower_bound(all(Versions[ind]),array<int,2>{ti+1,-1}) - Versions[ind].begin();
    return Versions[ind][it-1][1];
  };
  
  for(int i=1;i<=n;i++){
    int p = ind[a[i]]; // open element
    T.upd(1,1,n,max(1LL,p-k+1),min(n-k+1,p),1);
    if(i<k) continue;
    if(i > k){ // close element
      p = ind[a[i-k]];
      T.upd(1,1,n,max(1LL,p-k+1),min(n-k+1,p),-1);
    }
    vector<array<int,2>> v;
  	for(int x:delta[i]) v.push_back({x,i});
  	if(i>k) for(int x:delta[i-k]) v.push_back({x,i-k+1});
    sort(all(v));
    v.erase(unique(all(v)),v.end());
    int Time = 0;
    vector<array<int,2>> roll;
   
    // now time to do some updates and update answer array
    for(auto x:v){
      Ans.upd(1,0,q,Time,x[0]-1,T.seg[1]);
      Time = x[0];
      // close old value
      p = ind[Get_Val(x[1],x[0]-1)];
      T.upd(1,1,n,max(1LL,p-k+1),min(n-k+1,p),-1);
      roll.push_back({p,-1});
      // open new value
      p = ind[Get_Val(x[1],x[0])];
      T.upd(1,1,n,max(1LL,p-k+1),min(n-k+1,p),1);
      roll.push_back({p,1});
    }
    Ans.upd(1,0,q,Time,q,T.seg[1]);
    // rollback them
    while(!roll.empty()){
      auto xd = roll.back();
      roll.pop_back();
      p = xd[0];
      T.upd(1,1,n,max(1LL,p-k+1),min(n-k+1,p),-xd[1]);
    }
  }
  for(int i=0;i<=q;i++){
   auto U = Ans.get(1,0,q,i);
   cout << U[0] << ' ' << U[1] << '\n';
  }
}
int32_t main(){
  cin.tie(0); ios::sync_with_stdio(0);
  int tc=1;//cin >> tc;
  while(tc--) _();
  return 0;
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |