Submission #1273728

#TimeUsernameProblemLanguageResultExecution timeMemory
1273728dzuizzPoklon (COCI17_poklon)C++20
140 / 140
674 ms95616 KiB
#include<bits/stdc++.h>
using namespace std;
#define int long long
struct node{
  int l,r,m,v;
  node *lf,*rg;
  node(int _l,int _r): l(_l),r(_r),m((_l+_r)>>1),v(0) {
    if(l!=r)
      lf=new node(l,m),
      rg=new node(m+1,r);
  }
  void upd(int x,int _v){
    if(l==r){ v=_v; return; }
    if(x<=m) lf->upd(x,_v);
    else rg->upd(x,_v);
    v=lf->v+rg->v; 
  }
  int qry(int x,int y){
    //cout<<l<<" "<<r<<": "<<v<<'\n';
    if(r<x||l>y) return 0;
    if(x<=l&&r<=y) return v;
    return lf->qry(x,y)+rg->qry(x,y);
  }
}*root;
signed main(){
  ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  int n,q; cin>>n>>q;
  int a[n],ta[n];
  for(int i=0;i<n;++i){
    cin>>a[i];
    ta[i]=a[i];
  }
  sort(ta,ta+n);
  for(int i=0,m=unique(ta,ta+n)-ta;i<n;++i)
    a[i]=lower_bound(ta,ta+m,a[i])-ta;
  int nx[n],occ[n];
  memset(nx,-1,sizeof nx);
  memset(occ,-1,sizeof occ);
  for(int i=0;i<n;++i){
    if(occ[a[i]]!=-1) nx[occ[a[i]]]=i;
    occ[a[i]]=i;
  }
  root=new node(0,n-1);
  bool vi[n]; memset(vi,0,sizeof vi);
  for(int i=0;i<n;++i){
    if(vi[a[i]]) continue;
    vi[a[i]]=1;
    if(nx[i]!=-1){
      root->upd(nx[i],1);
      if(nx[nx[i]]!=-1) root->upd(nx[nx[i]],-1);
    }
  }
  //for(int i=0;i<n;++i) cout<<root->qry(i,i)<<" "; cout<<'\n';
  pair<pair<int,int>,int> qrys[q];
  for(int i=0;i<q;++i){
    cin>>qrys[i].first.first>>qrys[i].first.second;
    qrys[i].second=i;
  }
  sort(qrys,qrys+q);
  int ans[q];
  for(int i=0,pl=0;i<q;++i){
    auto[l,r]=qrys[i].first; --l,--r;
    while(pl<l){
      if(nx[pl]!=-1){
        root->upd(nx[pl],0);
        if(nx[nx[pl]]!=-1){
          root->upd(nx[nx[pl]],1);
          if(nx[nx[nx[pl]]]!=-1)
            root->upd(nx[nx[nx[pl]]],-1);
        }
      }
      ++pl;
    }
    ans[qrys[i].second]=root->qry(l,r);
  }
  for(auto&x:ans) cout<<x<<'\n';
  return 0;
}

#Verdict Execution timeMemoryGrader output
Fetching results...