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 <iostream>
using namespace std;
#define MOD 1000000007
int N, A[100005];
long long tree1[100005], tree2[100005];
int read(long long * tree, int idx) {
long long sum = 0;
while(idx > 0) {
sum += tree[idx];
sum %= MOD;
idx -= (idx & -idx);
}
return sum;
}
void update(long long * tree, int idx, int val) {
while(idx <= N) {
tree[idx] += val;
tree[idx] %= MOD;
idx += (idx & -idx);
}
}
int main() {
scanf("%d",&N);
for(int i = 1;i<=N;i++) {
scanf("%d",&A[i]);
}
sort(A + 1, A + 1 + N);
long long res = 0;
update(tree1, A[1], A[1]);
for(int i = 2;i<=N;i++) {
long long sum = read(tree1, A[i] - 1)%MOD;
res += A[i] * read(tree2, A[i] - 1);
res %= MOD;
if(sum > 0) {
update(tree2, A[i], (sum * A[i])%MOD);
}
update(tree1, A[i], A[i]);
}
cout<<res<<endl;
return 0;
}
# | 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... |