Submission #21033

#TimeUsernameProblemLanguageResultExecution timeMemory
21033model_codeŽarulje (COI15_zarulje)C++11
100 / 100
219 ms56428 KiB
#include <algorithm>
#include <cassert>
#include <cstring>
#include <iostream>
#include <stack>

using namespace std;

typedef long long llint;

const int MAXN = 1000100;
const int mod = 1e9 + 7;

int mul(int a, int b) {
  return llint(a)*b % mod;
}

int powmod(int a, int b) {
  if (b == 0) return 1;
  if (b&1) return mul(a, powmod(a, b-1));
  return powmod(mul(a, a), b/2);
}

int f[MAXN], invf[MAXN];
int a[MAXN], ans[MAXN];
int fl[MAXN], fr[MAXN];
vector<pair<int, int>> e[MAXN];

void add(int &a, int b, int d, int &ways) {
  ways = mul(ways, mul(f[a], mul(f[b], invf[a+b])));
  a += d;
  ways = mul(ways, mul(invf[a], mul(invf[b], f[a+b])));
}

int main(void) {
  int n, k;
  scanf("%d %d", &n, &k);
  for (int i = 0; i < n; ++i)
    scanf("%d", &a[i]);
  
  f[0] = invf[0] = 1;
  for (int i = 1; i <= n; ++i) {
    f[i] = mul(f[i-1], i);
    invf[i] = powmod(f[i], mod-2);
  }

  stack<int> S;
  for (int i = n-1; i >= 0; --i) {
    while (!S.empty() && S.top() > a[i]) {
      fr[S.top()]--;
      e[i].push_back({S.top(), +1});
      S.pop();
    }
    e[i].push_back({a[i], -1});
    fr[a[i]]++;
    S.push(a[i]);
  }
  while (!S.empty()) S.pop();

  int ways = 1;
  for (int i = 0; i < n; ++i) {
    for (auto &p: e[i])
      add(fr[p.first], fl[p.first], p.second, ways);    
    ans[i] = ways;

    while (!S.empty() && S.top() > a[i]) {
      add(fl[S.top()], fr[S.top()], -1, ways);
      S.pop();
    }
    add(fl[a[i]], fr[a[i]], +1, ways);
    S.push(a[i]);
  }
  
  for (int i = 0; i < k; ++i) {
    int p;
    scanf("%d", &p); --p;
    printf("%d\n", ans[p]);
  }
  return 0;
}

Compilation message (stderr)

zarulje.cpp: In function 'int main()':
zarulje.cpp:37:25: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", &n, &k);
                         ^
zarulje.cpp:39:23: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &a[i]);
                       ^
zarulje.cpp:76:20: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d", &p); --p;
                    ^

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...