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 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| const int N=5e5+10; int n,m; int a[N]; int last[N]; int t[N]; int ans[N]; struct qs { int l,r,id; }q[N]; int cmp(qs x,qs y) { return x.r<y.r; } struct tree { int val,pos; }; struct node { int val[N*4],pos[N*4],siz[N*4]; void pushup(int p) { if(val[p*2]<val[p*2+1]) val[p]=val[p*2],pos[p]=pos[p*2]; else val[p]=val[p*2+1],pos[p]=pos[p*2+1]; } void build(int p,int l,int r) { if(l==r) { val[p]=INF; pos[p]=l; return ; } int mid=(l+r)>>1; build(p*2,l,mid); build(p*2+1,mid+1,r); pushup(p); } void modify(int p,int l,int r,int x,int w) { if(l==r) { val[p]=w; return ; } int mid=(l+r)>>1; if(x<=mid) modify(p*2,l,mid,x,w); else modify(p*2+1,mid+1,r,x,w); pushup(p); } tree query(int p,int l,int r,int x,int y) { if(x<=l && r<=y) { return {val[p],pos[p]}; } int mid=(l+r)>>1; tree res={INF,0}; if(x<=mid) { tree tmp=query(p*2,l,mid,x,y); if(tmp.val<res.val) { res.val=tmp.val; res.pos=tmp.pos; } } if(y>=mid+1) { tree tmp=query(p*2+1,mid+1,r,x,y); if(tmp.val<res.val) { res.val=tmp.val; res.pos=tmp.pos; } } return res; } }g; int main() { n=read(); for(int i=1;i<=n;i++) { a[i]=read(); last[i]=t[a[i]]; t[a[i]]=i; } m=read(); for(int i=1;i<=m;i++) { q[i].l=read();q[i].r=read();q[i].id=i; } sort(q+1,q+m+1,cmp); g.build(1,1,n); int j=1; for(int i=1;i<=n;i++) { g.modify(1,1,n,i,last[i]); if(last[i]!=0) g.modify(1,1,n,last[i],INF); while(q[j].r==i && j<=m) { tree res=g.query(1,1,n,q[j].l,q[j].r); if(res.val<q[j].l) ans[q[j].id]=a[res.pos]; else ans[q[j].id]=0; j++; } } for(int i=1;i<=m;i++) { cout<<ans[i]<<endl; } return 0; }
|