---恢复内容开始---
可持久化线段树
http://www.lydsy.com/JudgeOnline/problem.php?id=4299
/************************************************************** Problem: 4299 User: 1349367067 Language: C++ Result: Accepted Time:5592 ms Memory:40728 kb ****************************************************************/ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int n,m; int a[100011]={},b[100011]={}; int g[100011]={},num=0; int nxt[100011]={}; struct Node { int x; Node *l,*r; Node() { l=r=NULL; x=0; } }nod[100011*32]; Node *T[100011]={}; int lower(int x) { int l,r,mid,t; l=1;r=n;t=0; while (l<=r) { mid=(l+r)/2; if (b[mid]<=x) {t=mid;l=mid+1;} else r=mid-1; } return t; } Node *ins(Node *now,int l,int r,int to,int x) { Node *now_; num++;now_=&nod[num]; if (now!=NULL) now_->x=now->x+x; else now_->x=x; if (l==r) return now_; int mid=(l+r)/2; if (to<=mid) if (now!=NULL) { now_->l=ins(now->l,l,mid,to,x); if (now->r!=NULL) now_->r=now->r; } else { now_->l=ins(NULL,l,mid,to,x); } else if (now!=NULL) { now_->r=ins(now->r,mid+1,r,to,x); if (now->l!=NULL) now_->l=now->l; } else { now_->r=ins(NULL,mid+1,r,to,x); } return now_; } int L,R; int ask(Node *x,int l,int r) { if (x==NULL) return 0; if (l>=L&&r<=R) return x->x; int mid,t; mid=(l+r)/2;t=0; if (L<=mid) t+=ask(x->l,l,mid); if (R>mid) t+=ask(x->r,mid+1,r); return t; } int query() { int j; for (int i=0;;i=j) if ((j=ask(T[lower(i+1)],1,n))==i) return i+1; } void init() { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]); for (int i=1;i<=n;i++) b[i]=a[i]; sort(b+1,b+n+1); for (int i=1;i<=n;i++) { a[i]=lower(a[i]); nxt[i]=g[a[i]]; g[a[i]]=i; } for (int i=1;i<=n;i++) { T[i]=T[i-1]; for (int j=g[i];j;j=nxt[j]) { T[i]=ins(T[i],1,n,j,b[i]); } } scanf("%d",&m); for (int i=1;i<=m;i++) { scanf("%d%d",&L,&R); printf("%d\n",query()); } } int main() { init(); return 0; }
时间: 2024-10-18 05:59:40