题目: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);
}
}
}