题目描述
花栗鼠很喜欢偷吃生产队的大萝卜,因此花栗鼠科技大学正在研究一种新型的数据库,叫做萝卜数据库。
具体来说,它支持 k(1 \leq k \leq 100)k(1≤k≤100) 个字段,每个字段名都是整数,里面存储的数值也都是整数。
现在你支持如下操作:
-
向数据库中插入一个记录,它可能只会包含 kk 个字段的某一部分。具体的操作格式详见“输入格式”。
-
在数据库中查询有多少条符合条件的记录。
现在你总共有 nn 次操作(1 \;\leq n \leq 10001≤n≤1000),请你对每个回答操作,输出结果。
输入格式
第一行两个整数 n,kn,k ,意义如题所述。
接下来的若干行,每行代表一次操作,具体如下:
-
1\ p\ x_1\ \ y_1,...,x_p\ y_p1 p x1 y1,...,xp yp :表示一个插入操作,其中共有 pp 个字段,第 ii 字段的名字是 x_ixi ,值为 y_iyi .此处我们保证 1 \leq x_i \leq k, 1\leq y_i \leq 10001≤xi≤k,1≤yi≤1000,并且 x_i,y_ixi,yi 均为整数。
-
2\ x\ y_{min}\ y_{max}2 x ymin ymax:表示一次查询操作,表示查询所有满足 字段 xx 的值在 [y_{min},y_{max}][ymin,ymax] 之间的记录有多少个。
输出格式
对于每个查询操作,输出一行一个整数,表示符合条件的记录个数。
输入输出样例
输入 #1
4 5
1 2 1 2 2 4
2 2 1 5
1 2 3 5 4 6
2 4 7 8
输出 #1
1
0
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
#include <unordered_map>
#include <map>
using namespace std;
int main() {
int k; // 最大长度为k
int n; // n次操作
int type; // 操作类别
int p; // 插入数量
int x, y; // 名字与值
int maxy, miny; // 查询范围
vector<vector<int>> res(1001);
cin >> n >> k;
while (n--) {
cin >> type;
if (type == 1) { //插入操作
cin >> p;
while (p--) {
cin >> x >> y;
res[x-1].emplace_back(y);
}
}
else{
int c = 0;
cin >> x >> miny >> maxy;
for (auto& i : res[x - 1])if (i >= miny && i <= maxy)c++;
cout << c << endl;
}
}
return 0;
}