杯具男。。。。。。。。。。。。。建个二维树状数组,一直WA,到最后也没搞清楚到底是哪里错了,杯具。。。。。。 #include <iostream> using namespace std; #define LL(a) a<<1 #define RR(a) a<<1|1 template<class T> inline void checkmax(T &a,T b) {if(a < b) a = b;} struct node1 { int left,right,val; int mid() { return (left+right)/2; } }; struct node2 { int left,right; node1 tt[4*1001]; int mid() { return (left+right)/2; } }st[4*101]; int n,sum; void bulid2(node1 tt[],int x,int y,int pos) { tt[pos].left=x;tt[pos].right=y; tt[pos].val=-1; if(x==y) return; bulid2(tt,x,tt[pos].mid(),LL(pos)); bulid2(tt,tt[pos].mid()+1,y,RR(pos)); } void bulid(int x,int y,int pos) { bulid2(st[pos].tt,0,1000,1); st[pos].left=x;st[pos].right=y; if(x==y) return; bulid(x,st[pos].mid(),LL(pos)); bulid(st[pos].mid()+1,y,RR(pos)); } void update2(node1 tt[],int y,int z,int root) { if(tt[root].left==tt[root].right) { checkmax(tt[root].val,z); return ; } if(y<=tt[root].mid()) update2(tt,y,z,LL(root)); else update2(tt,y,z,RR(root)); tt[root].val=max(tt[root].val,z); } void update(int x,int y,int z,int root) { update2(st[root].tt,y,z,1); if(st[root].left==st[root].right) return; if(x<=st[root].mid()) update(x,y,z,LL(root)); else update(x,y,z,RR(root)); } int ans2(node1 tt[],int x,int y,int root) { if(x<=tt[root].left&&y>=tt[root].right) { return tt[root].val; } int mid=tt[root].mid(); int sum=-1; if(y<=mid) checkmax(sum,ans2(tt,x,y,LL(root))); else if(x>mid) checkmax(sum,ans2(tt,x,y,RR(root))); else checkmax(sum,max(ans2(tt,x,mid,LL(root)),ans2(tt,mid+1,y,RR(root)))); return sum; } int ans(int x,int y,int z,int xx,int root) { if(x<=st[root].left&&y>=st[root].right) { return ans2(st[root].tt,z,xx,1); } int mid=st[root].mid(); int sum=-1; if(y<=mid) checkmax(sum,ans(x,y,z,xx,LL(root))); else if(x>mid) checkmax(sum,ans(x,y,z,xx,RR(root))); else checkmax(sum,max(ans(x,mid,z,xx,LL(root)),ans(mid+1,y,z,xx,RR(root)))); return sum; } int main() { while(scanf("%d",&n)&&n) { bulid(100,200,1); double b,c,a1,a2; int a,k; char s[2]; while(n--) { //while(!isalpha(s = getchar())); scanf("%s",s); if(s[0]=='I') { scanf("%d%lf%lf",&a,&b,&c); update(a,int(b*10),int(c*10),1); } else { scanf("%lf%lf%lf%lf",&a1,&a2,&b,&c); if(a1>a2) swap(a1,a2); if(b>c) swap(b,c); int ret = ans(int(a1),int(a2),int(b*10),int(c*10),1); if(ret < 0) printf("-1/n"); else printf("%.1lf/n",ret/10.0); } } } return 0; }