Alex_tz307

Maxime - 92p

Dec 12th, 2020 (edited)
448
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.43 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. #define INF 0x3f3f3f3f
  3.  
  4. using namespace std;
  5.  
  6. class InParser {
  7. private:
  8.     FILE *fin;
  9.     char *buff;
  10.     int sp;
  11.     char read_ch() {
  12.         ++sp;
  13.         if (sp == 4096) {
  14.             sp = 0;
  15.             fread(buff, 1, 4096, fin);
  16.         }
  17.         return buff[sp];
  18.     }
  19.  
  20. public:
  21.     InParser(const char* nume) {
  22.         fin = fopen(nume, "r");
  23.         buff = new char[4096]();
  24.         sp = 4095;
  25.     }
  26.     InParser& operator >> (int &n) {
  27.         char c;
  28.         while (!isdigit(c = read_ch()) && c != '-');
  29.         int sgn = 1;
  30.         if (c == '-') {
  31.             n = 0;
  32.             sgn = -1;
  33.         } else {
  34.             n = c - '0';
  35.         }
  36.         while (isdigit(c = read_ch())) {
  37.             n = 10 * n + c - '0';
  38.         }
  39.         n *= sgn;
  40.         return *this;
  41.     }
  42. };
  43.  
  44. class OutParser {
  45. private:
  46.     FILE *fout;
  47.     char *buff;
  48.     int sp;
  49.     void write_ch(char ch) {
  50.         if (sp == 50000) {
  51.             fwrite(buff, 1, 50000, fout);
  52.             sp = 0;
  53.             buff[sp++] = ch;
  54.         } else {
  55.             buff[sp++] = ch;
  56.         }
  57.     }
  58.  
  59. public:
  60.     OutParser(const char* name) {
  61.         fout = fopen(name, "w");
  62.         buff = new char[50000]();
  63.         sp = 0;
  64.     }
  65.     ~OutParser() {
  66.         fwrite(buff, 1, sp, fout);
  67.         fclose(fout);
  68.     }
  69.  
  70.     OutParser& operator << (int vu32) {
  71.         if (vu32 <= 9) {
  72.             write_ch(vu32 + '0');
  73.         } else {
  74.             (*this) << (vu32 / 10);
  75.             write_ch(vu32 % 10 + '0');
  76.         }
  77.         return *this;
  78.     }
  79.     OutParser& operator << (char ch) {
  80.         write_ch(ch);
  81.         return *this;
  82.     }
  83.     OutParser& operator << (const char *ch) {
  84.         while (*ch) {
  85.             write_ch(*ch);
  86.             ++ch;
  87.         }
  88.         return *this;
  89.     }
  90. };
  91.  
  92. InParser fin("maxime.in");
  93. OutParser fout("maxime.out");
  94.  
  95. int main() {
  96.     int N;
  97.     fin >> N;
  98.     vector<int> a(N + 1);
  99.     for(int i = 1; i <= N; ++i)
  100.         fin >> a[i];
  101.     vector<pair<int,int>> pref(N + 2);
  102.     vector<int> rep(N + 2), suf(N + 2), suf_mx(N + 2);
  103.     int mx = 0, cnt = 0;
  104.     for(int i = 1; i <= N; ++i) {
  105.         if(a[i] == pref[i - 1].first)
  106.             pref[i] = make_pair(a[i], pref[i - 1].second + 1);
  107.         else
  108.             if(a[i] > pref[i - 1].first)
  109.                 pref[i] = make_pair(a[i], 1);
  110.         else
  111.             pref[i] = pref[i - 1];
  112.         if(a[i] > mx)
  113.             mx = a[i];
  114.         else
  115.             if(a[i] == mx)
  116.                 ++cnt;
  117.         rep[i] = cnt;
  118.     }
  119.     suf[N + 1] = INF;
  120.     for(int i = N; i > 0; --i) {
  121.         suf[i] = min(a[i], suf[i + 1]);
  122.         suf_mx[i] = max(a[i], suf_mx[i + 1]);
  123.     }
  124.     int Q;
  125.     fin >> Q;
  126.     while(Q--) {
  127.         int p;
  128.         fin >> p;
  129.         if(pref[p].second > 1) {
  130.             int ans = rep[N];
  131.             if(a[p] == pref[p].first)
  132.                 --ans;
  133.             fout << ans << ' ';
  134.             continue;
  135.         }
  136.         if(a[p] < suf[p + 1] || a[p] != pref[p].first) {
  137.             fout << rep[N] << ' ';
  138.             continue;
  139.         }
  140.         int ans = rep[p];
  141.         mx = pref[p - 1].first;
  142.         for(int i = p + 1; i <= N; ++i) {
  143.             if(a[i] > mx)
  144.                 mx = a[i];
  145.             else
  146.                 if(a[i] == mx)
  147.                     ++ans;
  148.             if(mx > suf_mx[i + 1])
  149.                 break;
  150.         }
  151.         fout << ans << ' ';
  152.     }
  153. }
  154.  
Advertisement
Add Comment
Please, Sign In to add comment