1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83
| #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #define inf 0x3F3F3F3F using namespace std; typedef pair<int,int>pii; struct Node { int L,R,id; }b[500005]; struct Tree { int L,R; pii val; }T[2000005]; int a[500005],pre[500005],nxt[500005],h[500005],ans[500005]; inline void Modify(int L,int R,pii val,int v) { if(L>T[v].R||R<T[v].L)return; if(L<=T[v].L&&R>=T[v].R) { T[v].val=max(T[v].val,val);return; } Modify(L,R,val,v<<1); Modify(L,R,val,(v<<1)|1); return; } inline pii Query(int x,int v) { if(x>T[v].R||x<T[v].L)return make_pair(-inf,0); if(T[v].L==T[v].R)return T[v].val; return max(T[v].val,max(Query(x,v<<1),Query(x,(v<<1)|1))); } inline void Build(int L,int R,int v) { T[v].L=L;T[v].R=R; T[v].val=make_pair(-inf,0); if(L==R)return; int mid=(L+R)>>1; Build(L,mid,v<<1); Build(mid+1,R,(v<<1)|1); return; } inline bool cmp(const Node& a,const Node& b) { return a.R<b.R; } int main(void) { int i,j=1,n,m; scanf("%d",&n); for(i=1;i<=n;++i)scanf("%d",&a[i]); for(i=1;i<=n;++i) { if(!h[a[i]])pre[i]=0; else pre[i]=h[a[i]]; h[a[i]]=i; } memset(h,0,sizeof(h)); for(i=n;i>=1;--i) { if(!h[a[i]])nxt[i]=n+1; else nxt[i]=h[a[i]]; h[a[i]]=i; } scanf("%d",&m); for(i=1;i<=m;++i) { scanf("%d%d",&b[i].L,&b[i].R); b[i].id=i; } sort(b+1,b+m+1,cmp); Build(1,n+1,1); for(i=1;i<=m;++i) { while(j<=b[i].R)Modify(pre[j]+1,j,make_pair(nxt[j],a[j]),1),++j; pii tmp=Query(b[i].L,1); if(tmp.first>=j)ans[b[i].id]=tmp.second; } for(i=1;i<=m;++i)printf("%d\n",ans[i]); return 0; }
|
Related Issues not found
Please contact @lolifamily to initialize the comment