#include #define FOR(i,a,b) for (int i = (a); i <= (b); i++) #define FORD(i,a,b) for (int i = (a); i >= (b); i--) #define REP(i,b) for (int i = 0; i < (b); i++) using namespace std; typedef long long ll; ll secs[100005]; ll values[100005]; string s, f; int pridaj(int value, int dlzka_stara, int aktual, double aktual_f, const string& fun){ if(fun[1] == 'a'){ if (value > aktual) return value; else return aktual; } else if (fun[1] == 'i'){ if (value < aktual) return value; else return aktual; } else { return 0; } } double pridaj_f(int value, int dlzka_stara, int aktual, double aktual_f, const string& fun){ if(fun[1] == 'a' || fun[1] == 'i'){ return 0; } else { return ((dlzka_stara * aktual_f) + value) / (dlzka_stara + 1); } } int odober(int value, int dlzka_stara, int aktual, double aktual_f, const string& fun, multiset& posledne){ if(fun[1] == 'a'){ posledne.erase(value); if (value == aktual) { if(posledne.size() == 0) return -1000000; return (*posledne.rbegin()); } else return aktual; } else if (fun[1] == 'i'){ posledne.erase(value); if (value == aktual) { if(posledne.size() == 0) return 1000000; return (*posledne.begin()); } else return aktual; } else { return 0; } } double odober_f(int value, int dlzka_stara, int aktual, double aktual_f, const string& fun, multiset& posledne){ if(fun[1] == 'a' || fun[1] == 'i'){ return 0; } else { posledne.erase(value); return ((dlzka_stara * aktual_f) - value) / (dlzka_stara - 1); } } int main() { int n, m, l; while (scanf("%d", &n) == 1) { REP(i,n) scanf("%lld%lld", &secs[i], &values[i]); scanf("%d", &l); REP(i,l){ int range; cin>>s>>f>>range; int start = 0; int actual = -100000; if(f[1] == 'i') actual = 1000000; double actual_f = 0; int res = 0; multiset posledne; REP(k, n-1){ posledne.insert(values[k]); actual = pridaj(values[k], k - start + 1, actual, actual_f, f); actual_f = pridaj_f(values[k], k - start, actual, actual_f, f); while(secs[k+1] - secs[start] > range){ actual = odober(values[start], k - start + 1, actual,actual_f, f, posledne); actual_f = odober_f(values[start], k - start + 1, actual,actual_f, f, posledne); start++; } //printf("min: %.2f\n", actual_f); if(k + 1 != start){ if (s[0] == 'g'){ if(f[1] == 'v' && actual_f < values[k+1]) res++; if(f[1] != 'v' && actual < values[k+1]) res++; } else { if(f[1] == 'v' && actual_f > values[k+1]) res++; if(f[1] != 'v' && actual > values[k+1]) res++; } } } printf("%d\n", res); } } return 0; }