#include #include #include #include #include int times[10000]; int value[10000]; struct cond { int (*op)(int a, int b); int (*func)(int start_pt, int start_time, int time_back); int time_back; } conds[10]; int matches[10]; int gt(int a, int b) { return a>b; } int lt_(int a, int b) { /*printf("[%d %d %d]",a,b,a= 0; i--) { if (times[i] < start_time - time_back) break; if (value[i] < m) m = value[i]; } return m; } int max(int start_pt, int start_time, int time_back) { int m = -INT_MAX; for (int i = start_pt; i >= 0; i--) { if (times[i] < start_time - time_back) break; if (value[i] > m) m = value[i]; } return m; } int avg(int start_pt, int start_time, int time_back) { int64_t sum = 0; int cnt = 0; for (int i = start_pt; i >= 0; i--) { if (times[i] < start_time - time_back) break; sum += value[i]; cnt++; } if (!cnt) return -INT_MAX; return sum / cnt; } bool is_match(int i, int c) { int func_val = conds[c].func(i-1, times[i], conds[c].time_back); if (func_val == INT_MAX || func_val == -INT_MAX) return false; //printf("%d vs %d => %d\n", value[i], func_val, conds[c].op(value[i], func_val)); return conds[c].op(value[i], func_val); } int main() { int num; while (scanf("%d", &num) == 1) { for (int i = 0; i < num; i++) scanf("%d %d", ×[i], &value[i]); int num_conds; scanf("%d", &num_conds); for (int i = 0; i < num_conds; i++) { char op[10]; char func[10]; scanf("%s %s %d", op, func, &conds[i].time_back); if (!strcmp(op, "lt")) conds[i].op = lt_; else conds[i].op = gt; if (!strcmp(func, "min")) conds[i].func = min; else if (!strcmp(func, "max")) conds[i].func = max; else conds[i].func = avg; } memset(matches, 0, sizeof(matches)); for (int i = 0; i < num; i++) { for (int c = 0; c < num_conds; c++) { if (is_match(i, c)) matches[c]++; } } for (int c = 0; c < num_conds; c++) { printf("%d\n", matches[c]); } } }