Submission #631244

#TimeUsernameProblemLanguageResultExecution timeMemory
631244inksamuraiPoklon (COCI17_poklon)C++17
56 / 140
5074 ms41284 KiB
#include <bits/stdc++.h> #define int ll using namespace std; #define rep(i,n) for(int i=0;i<n;i++) #define rng(i,c,n) for(int i=c;i<n;i++) #define per(i,n) for(int i=n-1;i>=0;i--) #define fi first #define se second #define pb push_back #define sz(a) (int)a.size() #define vec(...) vector<__VA_ARGS__> #define _3phCa4T ios::sync_with_stdio(0),cin.tie(0) typedef long long ll; using pii=pair<int,int>; using vi=vector<int>; void print(){cout<<'\n';} template<class h,class...t> void print(const h&v,const t&...u){cout<<v<<' ',print(u...);} // e template<class S,S (*op)(S,S),S (*e)()> struct segtree{ int n; vec(S) seg; segtree(int _n){ init(_n); } void init(int _n){ n=1; while(n<=_n){ n*=2; } seg=vec(S)(2*n); n=_n; } S prod(int node,int l,int r,int _l,int _r){ if(l>=_r or r<=_l){ return e(); } if(_l<=l and r<=_r){ return seg[node]; } int m=(l+r)>>1; return op(prod(node*2,l,m,_l,_r),prod(node*2+1,m,r,_l,_r)); } S prod(int l,int r){ return prod(1,0,n,l,r); } void set(int node,int l,int r,int pos,const S&x){ if(l==r-1){ seg[node]=x; return; } int m=(l+r)/2; if(pos<m){ set(node*2,l,m,pos,x); }else{ set(node*2+1,m,r,pos,x); } seg[node]=op(seg[node*2],seg[node*2+1]); } void set(int pos,const S&x){ set(1,0,n,pos,x); } S get(int pos){ return prod(1,0,n,pos,pos+1); } }; int op(int l,int r){return l+r;} int e(){return 0;} signed main(){ _3phCa4T; int n,q; cin>>n>>q; vi a(n); rep(i,n){ cin>>a[i]; } vec(vec(pii)) qry(n); rep(i,q){ int l,r; cin>>l>>r; l-=1,r-=1; qry[l].pb(pii(r,i)); } vi pns(q); std::map<int,int> _lst,__lst; rep(i,n){ _lst[a[i]]=n; __lst[a[i]]=n; } segtree<int,op,e> seg(n+1); per(i,n){ int v=a[i]; int nj=_lst[v]; int j=__lst[v]; seg.set(nj,1); seg.set(j,-1); for(auto p:qry[i]){ int now=0; std::map<int,int> mp; rng(j,i,p.fi+1){ mp[a[j]]+=1; if(mp[a[j]]==2)now+=1; else if(mp[a[j]]==3)now-=1; } pns[p.se]=now; // pns[p.se]=seg.prod(i,p.fi+1); } __lst[v]=nj; _lst[v]=i; } rep(i,q){ cout<<(pns[i])<<"\n"; } }
#Verdict Execution timeMemoryGrader output
Fetching results...