This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <bits/stdc++.h>
using namespace std;
int dx[] = {0, 0, -1, 1};
int dy[] = {1, -1, 0, 0};
int const mod = 1e6 + 3;
mt19937 RNG(chrono::steady_clock::now().time_since_epoch().count());
int mul(long long x, long long y) {
while(x >= mod) x -= mod;
while(y >= mod) y -= mod;
return (x * y) % mod;
}
int add(long long x, long long y) {
while(x >= mod) x -= mod;
while(y >= mod) y -= mod;
return (x + y) % mod;
}
int sub(long long x, long long y) {
while(x >= mod) x -= mod;
while(y >= mod) y -= mod;
return (x - y + mod) % mod;
}
int power(long long x, long long y) {
if(y == 0) return 1;
if(y == 1) return x;
int ret = power(x, y / 2);
ret = mul(ret, ret);
if(y % 2) ret = mul(ret, x);
return ret;
}
int inv(long long x) {
return power(x, mod - 2);
}
int divide(long long x, long long y) {
while(x >= mod) x -= mod;
while(y >= mod) y -= mod;
return mul(x, inv(y));
}
int tree[4000006];
void update(int nod, int l, int r, int x, int val) {
if (x < l || r < x) return;
if (l == r) {
tree[nod] = val;
return;
}
int mid = (l + r) / 2;
update(nod * 2, l, mid, x, val);
update(nod * 2 + 1, mid + 1, r, x, val);
tree[nod] = min(tree[nod * 2], tree[nod * 2 + 1]);
}
int get(int nod, int l, int r, int x, int y) {
if (r < x || y < l) return 1e9 + 1;
if (x <= l && r <= y) return tree[nod];
int mid = (l + r) / 2;
return min(get(nod * 2, l, mid, x, y), get(nod * 2 + 1, mid + 1, r, x, y));
}
void solve() {
int n = 1e6;
cin >> n;
vector<int> h(n);
map<int, vector<int>> indices;
for(int i = 0; i < n; ++i) {
h[i] = RNG() % (int)1e9 + 1;
cin >> h[i];
indices[h[i]].push_back(i);
update(1, 0, n - 1, i, h[i]);
}
set<int> have, rem, all;
for(int i = 0; i < n; ++i) {
rem.insert(i);
all.insert(h[i]);
}
auto sum = [&](int l, int r) {
return (1LL * (l + r) * (r - l + 1) / 2) % mod;
};
long long ans = 0;
for(auto i : all) {
for(auto j : indices[i]) {
have.insert(j);
rem.erase(j);
update(1, 0, n - 1, j, 1e9 + 1);
}
if(rem.size() == 0) break;
if(have.size() == 0) continue;
while(have.size() && *have.begin() < *rem.begin())
have.erase(have.begin());
while(have.size() && *prev(have.end()) > *prev(rem.end()))
have.erase(prev(have.end()));
if(have.size() == 0) continue;
int l = *have.begin(), r = *prev(have.end());
int z1 = get(1, 0, n - 1, 0, l - 1);
int z2 = get(1, 0, n - 1, r + 1, n - 1);
int x = min({get(1, 0, n - 1, l, r), z1, z2});
auto it = all.upper_bound(i);
int dif = *it - i;
if(l == r) {
ans = add(ans, mul(z1 + z2, dif));
}
else {
ans = add(ans, mul(z1 + z2, dif));
ans = add(ans, mul(x, dif));
ans = add(ans, sum(i + 1, i + dif));
ans = add(ans, mul(mul((have.size() - 2), sum(i + 1, i + dif)), 2));
}
ans = add(ans, mul(have.size(), sum(i, i + dif - 1)));
}
cout << ans << endl;
return;
}
main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int t = 1;
//cin >> t;
while(t--) {
solve();
}
return 0;
}
Compilation message (stderr)
Main.cpp:126:1: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
126 | main() {
| ^~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |