#include #include #include #include #include using namespace std; vector tm; vector val; struct Accum { virtual void add(int val) =0; virtual void rem(int val) =0; virtual double get() =0; }; struct Min : public Accum { void add(int val) { vals.insert(val); } void rem(int val) { auto it = vals.find(val); vals.erase(it); } double get() { return vals.empty() ? -1 : *vals.begin(); } multiset vals; }; struct Max : public Accum { void add(int val) { vals.insert(val); } void rem(int val) { auto it = vals.find(val); vals.erase(it); } double get() { return vals.empty() ? -1 : *vals.rbegin(); } multiset vals; }; struct Mean : public Accum { void add(int val) { cnt++; sum+=val;} void rem(int val) { --cnt; sum-=val; } double get() { return (cnt > 0) ? double(sum)/cnt : -1; } uint64_t cnt = 0; uint64_t sum = 0; }; struct Eval { int maxTime; int first = 0; int okCnt = 0; shared_ptr ac; bool less = true; }; int main(int argc, char **argv) { int CNT; while (cin >> CNT) { tm.clear(); val.clear(); tm.resize(CNT); val.resize(CNT); for( int i=0; i> tm[i]; cin >> val[i]; } int ECNT; cin >> ECNT; vector evals; evals.resize(ECNT); for (int i=0; i> ev; //cout << "#### " << ev << " " << (ev == "lt") << endl; evals[i].less = ev == "lt"; cin >> rel; if (rel == "min") evals[i].ac.reset(new Min); else if( rel == "max") evals[i].ac.reset(new Max); else evals[i].ac.reset(new Mean); cin >> evals[i].maxTime; } for (int i=0; i0) { while(tm[e.first] < (tm[i] - e.maxTime)) { e.ac->rem(val[e.first]); e.first++; } if (e.firstget()) e.okCnt++; } else { if (val[i] > e.ac->get()) e.okCnt++; } /* cout << val[i] << " " << e.ac->get() << " ok" << e.okCnt << " first" << tm[e.first] << " max" << e.maxTime << " op" << e.less << endl; */ } } e.ac->add(val[i]); } } for (int j=0; j