import std.stdio, std.string, std.range, std.conv, std.array, std.algorithm, std.math, std.typecons, std.functional;

void main() {
    struct Query { long p, q; }

    auto tmp = readln.split.to!(long[]);
    const N = tmp[0], M = tmp[1], Q = tmp[2];
    auto count = new long[][](N+1,N+1);
    foreach (i; 0..M) {
        tmp = readln.split.to!(long[]);
        const L = tmp[0], R = tmp[1];
        count[L][R]++;
    }

    auto queryList = new Query[Q];
    foreach (i; 0..Q) {
        tmp = readln.split.to!(long[]);
        const p = tmp[0], q = tmp[1];
        queryList[i] = Query(p,q);
    }
    // p <= L && R <= qの数を求める
    // ある電車の情報を(L,R)として二次元平面にプロットすると、
    // (p,q)に対して右下にある電車の個数を数える問題になる
    /*
       (0,N) --- (p,N) --- (L,N) --- (N,N)
         |         |         |         |
       (0,q) --- (p,q) --- (L,q) --- (N,q)
         |         |         |         |
       (0,R) --- (p,R) --- (L,R) --- (N,R)
         |         |         |         |
       (0,0) --- (p,0) --- (L,0) --- (N,0)
    */
    // これは、原点から(x,y)までにある電車の個数をf(x,y)としたとき
    // f(N,q) - f(p-1,q)で表される
    foreach (i; 0..N+1) {
        foreach (j; 0..N) {
            count[i][j+1] += count[i][j];
        }
    }
    foreach (i; 0..N) {
        foreach (j; 0..N+1) {
            count[i+1][j] += count[i][j];
        }
    }
    foreach (query; queryList) {
        with (query) {
            writeln(count[N][q] - count[p-1][q]);
        }
    }
}

