简单的线段树。需要离散化一下。
代码:
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <string>
using namespace std;
const int N=100010;
int c[(N*3)<<2],t[N][2],q[N],id[N*3];
int n;
void pushdown(int rt)
{
if(c[rt]!=-1)
c[rt<<1]=c[rt<<1|1]=c[rt];
}
void pushup(int rt)
{
if(c[rt<<1]==c[rt<<1|1])
c[rt]=c[rt<<1];
else c[rt]=-1;
}
void update(int l,int r,int rt,int L,int R,int val)
{
if(L<=l && r<=R){
c[rt]=val;
return;
}
pushdown(rt);
int mid=(l+r)>>1;
if(L<=mid)update(l,mid,rt<<1,L,R,val);
if(R>mid)update(mid+1,r,rt<<1|1,L,R,val);
pushup(rt);
}
int query(int l,int r,int rt,int w)
{
if(l==r&&l==w){
return c[rt];
}
pushdown(rt);
int mid=(l+r)>>1,ret;
if(w<=mid)ret=query(l,mid,rt<<1,w);
else ret=query(mid+1,r,rt<<1|1,w);
//pushup(rt);
return ret;
}
int main()
{
int i,j,k,L,R,m;
while(scanf("%d",&n)!=EOF)
{
k=0;
for(i=1;i<=n;i++){
scanf("%d%d",&t[i][0],&t[i][1]);
id[k++]=t[i][0];
id[k++]=t[i][1];
}
scanf("%d",&m);
for(i=0;i<m;i++){
scanf("%d",&q[i]);
id[k++]=q[i];
}
sort(id,id+k);
k=unique(id,id+k)-id;
memset(c,-1,sizeof(c));
for(i=1;i<=n;i++){
L=lower_bound(id,id+k,t[i][0])-id+1;
R=lower_bound(id,id+k,t[i][1])-id+1;
update(1,k,1,L,R,i);
}
for(i=0;i<m;i++){
printf("%d\n",query(1,k,1,lower_bound(id,id+k,q[i])-id+1));
}
}
return 0;
}