Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- #define INF 0x3f3f3f3f
- using namespace std;
- class InParser {
- private:
- FILE *fin;
- char *buff;
- int sp;
- char read_ch() {
- ++sp;
- if (sp == 4096) {
- sp = 0;
- fread(buff, 1, 4096, fin);
- }
- return buff[sp];
- }
- public:
- InParser(const char* nume) {
- fin = fopen(nume, "r");
- buff = new char[4096]();
- sp = 4095;
- }
- InParser& operator >> (int &n) {
- char c;
- while (!isdigit(c = read_ch()) && c != '-');
- int sgn = 1;
- if (c == '-') {
- n = 0;
- sgn = -1;
- } else {
- n = c - '0';
- }
- while (isdigit(c = read_ch())) {
- n = 10 * n + c - '0';
- }
- n *= sgn;
- return *this;
- }
- };
- class OutParser {
- private:
- FILE *fout;
- char *buff;
- int sp;
- void write_ch(char ch) {
- if (sp == 50000) {
- fwrite(buff, 1, 50000, fout);
- sp = 0;
- buff[sp++] = ch;
- } else {
- buff[sp++] = ch;
- }
- }
- public:
- OutParser(const char* name) {
- fout = fopen(name, "w");
- buff = new char[50000]();
- sp = 0;
- }
- ~OutParser() {
- fwrite(buff, 1, sp, fout);
- fclose(fout);
- }
- OutParser& operator << (int vu32) {
- if (vu32 <= 9) {
- write_ch(vu32 + '0');
- } else {
- (*this) << (vu32 / 10);
- write_ch(vu32 % 10 + '0');
- }
- return *this;
- }
- OutParser& operator << (char ch) {
- write_ch(ch);
- return *this;
- }
- OutParser& operator << (const char *ch) {
- while (*ch) {
- write_ch(*ch);
- ++ch;
- }
- return *this;
- }
- };
- InParser fin("maxime.in");
- OutParser fout("maxime.out");
- int main() {
- int N;
- fin >> N;
- vector<int> a(N + 1);
- for(int i = 1; i <= N; ++i)
- fin >> a[i];
- vector<pair<int,int>> pref(N + 2);
- vector<int> rep(N + 2), suf(N + 2), suf_mx(N + 2);
- int mx = 0, cnt = 0;
- for(int i = 1; i <= N; ++i) {
- if(a[i] == pref[i - 1].first)
- pref[i] = make_pair(a[i], pref[i - 1].second + 1);
- else
- if(a[i] > pref[i - 1].first)
- pref[i] = make_pair(a[i], 1);
- else
- pref[i] = pref[i - 1];
- if(a[i] > mx)
- mx = a[i];
- else
- if(a[i] == mx)
- ++cnt;
- rep[i] = cnt;
- }
- suf[N + 1] = INF;
- for(int i = N; i > 0; --i) {
- suf[i] = min(a[i], suf[i + 1]);
- suf_mx[i] = max(a[i], suf_mx[i + 1]);
- }
- int Q;
- fin >> Q;
- while(Q--) {
- int p;
- fin >> p;
- if(pref[p].second > 1) {
- int ans = rep[N];
- if(a[p] == pref[p].first)
- --ans;
- fout << ans << ' ';
- continue;
- }
- if(a[p] < suf[p + 1] || a[p] != pref[p].first) {
- fout << rep[N] << ' ';
- continue;
- }
- int ans = rep[p];
- mx = pref[p - 1].first;
- for(int i = p + 1; i <= N; ++i) {
- if(a[i] > mx)
- mx = a[i];
- else
- if(a[i] == mx)
- ++ans;
- if(mx > suf_mx[i + 1])
- break;
- }
- fout << ans << ' ';
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment