题目:http://hihocoder.com/problemset/problem/1299
代码:
#include<stdio.h> #include<string.h> #include<algorithm> const int N = 100005; const int M = 100000; const int inf = 100000; const int mod = 2009; using namespace std; struct tree { int left,right; int maxn; }s[4*N]; int a[N]; void build(int l,int r,int p) { s[p].left=l; s[p].right=r; if(l==r) { s[p].maxn=a[l]; return ; } int mid=(l+r)/2; build(l,mid,p*2); build(mid+1,r,p*2+1); s[p].maxn=max(s[p*2].maxn,s[p*2+1].maxn); } int search(int l,int r,int p) { if(l<=s[p].left&&s[p].right<=r) { return s[p].maxn; } int mid=(s[p].left+s[p].right)/2; if(l>mid) return search(l,r,p*2+1); else if(r<=mid) return search(l,r,p*2); else return max(search(l,mid,p*2),search(mid+1,r,p*2+1)); } int main() { int n,m; while(~scanf("%d%d",&n,&m)) { memset(a,0,sizeof(a)); int t,v; for(int i=0;i<n;i++) { scanf("%d%d",&t,&v); a[t]=max(a[t],v); } build(1,n,1); /*for(int i=1;i<=30;i++) { printf("%d %d %d\n",s[i].left,s[i].right,s[i].maxn); }*/ int l,r; for(int i=0;i<m;i++) { scanf("%d%d",&l,&r); int ans=search(l,r,1); if(!ans) printf("None\n"); else printf("%d\n",ans); } } }