#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, ll sum){ if(fun[1] == 'a' || fun[1] == 'i'){ return 0; } else { return sum + value; 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, ll sum){ if(fun[1] == 'a' || fun[1] == 'i'){ return 0; } else { posledne.erase(value); return sum - value; return ((dlzka_stara * aktual_f) - value) / (dlzka_stara - 1); } } bool condi_g(ll sum, ll length, ll value){ if(sum % length == 0){ return (sum / length) < value; } else { return (((double) sum)/length) < value; } } bool condi_s(ll sum, ll length, ll value){ if(sum % length == 0){ return (sum / length) > value; } else { return (((double) sum)/length) > value; } } 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; ll sum = 0; REP(k, n-1){ posledne.insert(values[k]); actual = pridaj(values[k], k - start + 1, actual, actual_f, f); sum = pridaj_f(values[k], k - start, sum, actual_f, f, sum); while(secs[k+1] - secs[start] > range){ actual = odober(values[start], k - start + 1, actual,actual_f, f, posledne); sum = odober_f(values[start], k - start + 1, actual,actual_f, f, posledne, sum); start++; } //printf("min: %.2f\n", actual_f); if(k + 1 != start){ if (s[0] == 'g'){ if(f[1] == 'v' && condi_g(sum, k + 1 - start, values[k+1])) res++; if(f[1] != 'v' && actual < values[k+1]) res++; } else { if(f[1] == 'v' && condi_s(sum, k + 1 - start, values[k+1])) res++; if(f[1] != 'v' && actual > values[k+1]) res++; } } } printf("%d\n", res); } } return 0; }