zoj 3888 线段树 ***
卡n^2,用线段树降到nlogn
记录每个点上所覆盖线段的次小值,保证能有两条路径能走
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9 #define MOD 1000000007 10 const int INF=0x3f3f3f3f; 11 const double eps=1e-5; 12 #define lson l,mid,rt<<1 13 #define rson mid+1,r,rt<<1|1 14 #define root 1,n,1 15 #define mid ((l+r)>>1) 16 typedef long long ll; 17 #define cl(a) memset(a,0,sizeof(a)) 18 #define ts printf("*****\n"); 19 const int N=51005; 20 int n,m,tt; 21 int a[N<<4],b[N<<4]; 22 void pushdown(int rt) 23 { 24 //printf("pd:%d %d %d\n",a[rt],b[rt],rt); 25 if(b[rt]!=9999999) 26 { 27 if(b[rt]>=a[rt<<1]&&b[rt]<b[rt<<1]) 28 { 29 b[rt<<1]=b[rt]; 30 } 31 if(b[rt]<a[rt<<1]) 32 { 33 a[rt<<1]=b[rt<<1]; 34 a[rt<<1]=b[rt]; 35 } 36 if(b[rt]>=a[rt<<1|1]&&b[rt]<b[rt<<1|1]) 37 { 38 b[rt<<1|1]=b[rt]; 39 } 40 if(b[rt]<a[rt<<1|1]) 41 { 42 b[rt<<1|1]=a[rt<<1|1]; 43 a[rt<<1|1]=b[rt]; 44 } 45 b[rt]=9999999; 46 } 47 /*if(rt==4) 48 { 49 printf("%d %d\n",a[rt<<1],b[rt<<1]); 50 }*/ 51 if(a[rt]!=9999999) 52 { 53 if(a[rt]>=a[rt<<1]&&a[rt]<b[rt<<1]) 54 { 55 b[rt<<1]=a[rt]; 56 } 57 if(a[rt]<a[rt<<1]) 58 { 59 b[rt<<1]=a[rt<<1]; 60 a[rt<<1]=a[rt]; 61 } 62 if(a[rt]>=a[rt<<1|1]&&a[rt]<b[rt<<1|1]) 63 { 64 b[rt<<1|1]=a[rt]; 65 } 66 if(a[rt]<a[rt<<1|1]) 67 { 68 b[rt<<1|1]=a[rt<<1|1]; 69 a[rt<<1|1]=a[rt]; 70 } 71 a[rt]=9999999; 72 } 73 //printf("%d %d ++%d++\n",a[rt<<1],b[rt<<1],rt<<1); 74 } 75 void build(int l,int r,int rt) 76 { 77 a[rt]=b[rt]=9999999; 78 if(l==r) 79 { 80 a[rt]=b[rt]=l; 81 return; 82 } 83 build(lson); 84 build(rson); 85 } 86 void update(int L,int R,int val,int l,int r,int rt) 87 { 88 if(l>=L&&r<=R) 89 { 90 int x=val; 91 if(b[rt]>x&&x>a[rt]) 92 { 93 b[rt]=x; 94 } 95 if(x<b[rt]) 96 { 97 b[rt]=a[rt]; 98 a[rt]=x; 99 } 100 return; 101 } 102 pushdown(rt); 103 if(L<=mid) update(L,R,val,lson); 104 if(R>mid) update(L,R,val,rson); 105 } 106 int query(int pos,int l,int r,int rt) 107 { 108 //printf("%d %d %d %d %d\n",a[rt],b[rt],l,r,rt); 109 if(l==r) 110 { 111 return b[rt]; 112 } 113 pushdown(rt); 114 if(pos<=mid) return query(pos,lson); 115 else return query(pos,rson); 116 } 117 int main() 118 { 119 int i,j,k,ca=1,q; 120 #ifndef ONLINE_JUDGE 121 freopen("1.in","r",stdin); 122 #endif 123 while(scanf("%d%d%d",&n,&m,&q)!=EOF) 124 { 125 int x,y; 126 build(root); 127 for(i=0;i<m;i++) 128 { 129 scanf("%d%d",&y,&x); 130 update(x,y,x,root); //记录次小x 131 } 132 while(q--) 133 { 134 scanf("%d",&x); 135 printf("%d\n",x-query(x,root)); 136 } 137 } 138 }