1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
   | #include<cstdio> #include<cstring> #include<algorithm> #define N 31000 #define NN 61000 using namespace std; struct node { 	int lc,rc,co,d; }tr[NN];int len; inline void pushlazy(int x,int k){tr[x].co=k;} inline void updata(int x) { 	if(tr[tr[x].lc].co==tr[tr[x].rc].co)tr[x].co=tr[tr[x].lc].co; 	else tr[x].co=-1; } inline void pushdown(int x) { 	if(tr[x].co!=-1) 	{ 		pushlazy(tr[x].lc,tr[x].co); 		pushlazy(tr[x].rc,tr[x].co); 	} } int be[N]; void bt(int l,int r) { 	int x=++len;tr[x].co=0; 	if(l+1<r) 	{ 		int mid=(l+r)>>1; 		tr[x].lc=len+1;bt(l,mid); 		tr[x].rc=len+1;bt(mid,r); 	} } void change(int x,int l,int r,int ll,int rr,int k) { 	if(tr[x].co==k)return ; 	if(l==ll && r==rr){pushlazy(x,k);return ;} 	pushdown(x); 	int mid=(l+r)>>1; 	if(rr<=mid)change(tr[x].lc,l,mid,ll,rr,k); 	else if(mid<=ll)change(tr[x].rc,mid,r,ll,rr,k); 	else change(tr[x].lc,l,mid,ll,mid,k),change(tr[x].rc,mid,r,mid,rr,k); 	updata(x); } int ansl,ansr,suml,sumr; inline void gen() { 	if(be[sumr]-be[suml]>be[ansr]-be[ansl])ansl=suml,ansr=sumr; } void Query(int x,int l,int r) { 	if(tr[x].co==1) 	{ 		gen();suml=sumr=r; 		return ; 	} 	else if(tr[x].co==0) 	{ 		sumr=r; 		return ; 	} 	int mid=(l+r)>>1; 	Query(tr[x].lc,l,mid);Query(tr[x].rc,mid,r); } int ll[N],rr[N],type[N],m; struct Lisan { 	int *x,val; }li[N];int top,n; inline bool cmp(Lisan x,Lisan y){return x.val<y.val;} int main() { 	scanf("%d",&m);m++; 	ll[1]=0;rr[1]=1e9;type[1]=0; 	li[++top].x=&ll[1];li[top].val=ll[1]; 	li[++top].x=&rr[1];li[top].val=rr[1]; 	for(int i=2;i<=m;i++) 	{ 		char st[10];scanf("%d%d%s",&ll[i],&rr[i],st+1); 		if(st[1]=='b')type[i]=1; 		li[++top].x=&ll[i];li[top].val=ll[i]; 		li[++top].x=&rr[i];li[top].val=rr[i]; 	} 	sort(li+1,li+top+1,cmp); 	n=*li[1].x=1;be[1]=li[1].val; 	for(int i=2;i<=top;i++) 	{ 		if(li[i].val!=li[i-1].val)n++,be[n]=li[i].val; 		*li[i].x=n; 	} 	bt(1,n); 	for(int i=2;i<=m;i++)change(1,1,n,ll[i],rr[i],type[i]); 	Query(1,1,n); 	gen(); 	printf("%d %d\n",be[ansl],be[ansr]); 	return 0; }
   |