import core.stdc.stdio;
import std.algorithm;
import std.range;
import std.typecons;
import std.stdio;

struct Seg{
	int[] crd;
	int s=1;
	long[] v,d;
	void Init(){
		crd.sort;
		int last=-1,i;
		foreach(c;crd){
			if(last!=c) crd[i++]=c;
			last=c;
		}
		while(s<i)s*=2;
		crd.length=s+1;
		foreach(ref v;crd[i..$]) v=last;
		v=new long[s*2],d=new long[s*2];
	}
	void Propagate(int i,int l,int r){
		v[i]+=d[i]*(crd[r]-crd[l]);
		d[i*2]+=d[i],d[i*2+1]+=d[i];
		d[i]=0;
	}
	long _add(int b,int e,int l,int r,int a,int i){
		if(e<=l||r<=b)
			return v[i]+d[i]*(crd[r]-crd[l]);
		else if(b<=l&&r<=e){
			d[i]+=a;
			return v[i]+d[i]*(crd[r]-crd[l]);
		}else{
			Propagate(i,l,r);
			return v[i]=_add(b,e,l,(l+r)/2,a,i*2)+_add(b,e,(l+r)/2,r,a,i*2+1);
		}
	}
	void Add(int b,int e,int a){
		_add(cast(int)crd.assumeSorted.lowerBound(b).length,cast(int)crd.assumeSorted.lowerBound(e).length,0,s,a,1);
	}
	long _get(int b,int e,int l,int r,int i){
		if(e<=l||r<=b)
			return 0;
		else if(b<=l&&r<=e)
			return v[i]+d[i]*(crd[r]-crd[l]);
		else{
			Propagate(i,l,r);
			return _get(b,e,l,(l+r)/2,i*2)+_get(b,e,(l+r)/2,r,i*2+1);
		}
	}
	long Get(int b,int e){
		if(e<=crd[0]||crd[$-1]<=b) return 0;
		b=max(b,crd[0]),e=min(e,crd[$-1]);
		int u=cast(int)crd.assumeSorted.lowerBound(b).length;
		int v=cast(int)crd.assumeSorted.lowerBound(e).length;
		long ret = _get(u,v,0,s,1);
		if(crd[u]!=b)
			ret+=_get(u-1,u,0,s,1)/(crd[u]-crd[u-1])*(crd[u]-b);
		if(crd[v]!=e)
			ret-=_get(v-1,v,0,s,1)/(crd[v]-crd[v-1])*(crd[v]-e);
		return ret;
	}
}

void main(){
	int n,m,q;
	scanf("%d%d%d",&n,&m,&q);
	alias Tuple!(int,"a",int,"b",int,"c") query;
	query[] aq = new query[m];
	int[int] idx;
	foreach(ref v;aq){
		scanf("%d%d%d",&v.a,&v.b,&v.c);
		idx[v.c]=1;
	}
	int[] vs=idx.keys.sort;
	foreach(i,k;vs)
		idx[k]=i;
	Seg[] ss = new Seg[vs.length];
	foreach(v;aq){
		int i=idx[v.c];
		while(i<ss.length){
			ss[i].crd~=v.a;
			ss[i].crd~=v.b+1;
			i+=(i+1)&(-i-1);
		}
	}
	foreach(ref s;ss)
		s.Init;
	foreach(v;aq){
		int i=idx[v.c];
		while(i<ss.length){
			ss[i].Add(v.a,v.b+1,1);
			i+=(i+1)&(-i-1);
		}
	}
	int d;
	foreach(i;0..20)
		if((1<<i)&cast(int)(ss.length))
			d=(1<<i);
	foreach(_;0..q){
		int a,b;
		long c;
		scanf("%d%d%lld",&a,&b,&c);
		int i=d;
		int ans=cast(int)vs.length;
		while(1){
			if(i<=vs.length){
				long r=ss[i-1].Get(a,b+1);
				if(r>=c) ans=i;
				int bb=i&-i;
				if(bb==1) break;
				if(r<c) c-=r,i+=bb/2;
				else i-=bb/2;
			}else
				i-=i&-i;
		}
		printf("%d\n",vs[ans-1]);
	}
}