public SuffixTreeNode lowestCommonAncestor(SuffixTreeNode x, SuffixTreeNode y){
		if(!isProcessedForLCA)
			preProcessTree();
		SuffixTreeNode _x = null;
		SuffixTreeNode _y = null;
		int b = Utils.LCAinB(x.I.preorder, y.I.preorder);
		int heightZ = Utils.findOneBitLeftPosition(Utils.height(b), x.A, y.A);
		if(heightZ==Utils.height(x.I.preorder)){
			_x = x;
		}else{
			int heightW = Utils.findOneBitRightPosition(heightZ,x.A);
			int IW = Utils.shift(x.I.preorder, heightW);
			SuffixTreeNode temp = x;
			while(temp!=root){
				if(temp.I.preorder==IW){
					_x = findRunLeader(temp);
					break;
				}
				temp = temp.parent;
			}
		}
		if(heightZ==Utils.height(y.I.preorder)){
			_y = y;
		}else{
			int heightW = Utils.findOneBitRightPosition(heightZ,y.A);
			int IW = Utils.shift(y.I.preorder, heightW);
			SuffixTreeNode temp = y;
			while(temp!=root){
				if(temp.I.preorder==IW){
					_y = findRunLeader(temp);
					break;
				}
				temp = temp.parent;
			}
		}
		return _x.preorder<=_y.preorder?_x:_y;
	}