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>
#include<ext/pb_ds/tree_policy.hpp>
#include<ext/pb_ds/assoc_container.hpp>
#define y1 theboatman
#define make_struct(args...) {args}
using namespace std;
using namespace __gnu_pbds;
typedef long long ll;
template <typename T> using ordset = tree <T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
const long long INF = ll(1e18) + 10;
const int inf = int(1e9) + 10;
const int N = int(1e6) + 10;
struct Tree {
int n, timer;
vector <int> t, t1;
void init(int _n) {
n = _n;
timer = 0;
t.resize(n + 1);
}
void add(int pos, int delta) {
for(int i = pos; i <= n; i += i & -i) {
t[i] += delta;
}
}
int get(int pos) {
int res = 0;
for(int i = pos; i > 0; i -= i & -i) {
res += t[i];
}
return res;
}
int get(int l, int r) {
return get(r) - get(l - 1);
}
};
void brute() {
int n, m;
cin >> n >> m;
vector <int> a(n);
for(int i = 0; i < n; i++) {
cin >> a[i];
}
while(m--) {
int type;
cin >> type;
if (type == 1) {
int pos, val;
cin >> pos >> val;
pos--;
a[pos] = val;
}
else {
int x;
cin >> x;
int ans = 0;
for(auto i : a) {
if (i == x) {
ans++;
}
}
for(int i = 1; i < n; i++) {
int l = min(a[i], a[i - 1]);
int r = max(a[i], a[i - 1]);
if (l < x && x < r) {
ans++;
}
}
cout << ans << "\n";
}
}
}
int main() {
//freopen("game.in", "r", stdin);
//freopen("game.out", "w", stdout);
cin.tie(0);
ios::sync_with_stdio(0);
int n, m;
cin >> n >> m;
vector <int> a(n);
for(int i = 0; i < n; i++) {
cin >> a[i];
}
Tree osuL, osuR;
osuL.init(N);
osuR.init(N);
for(int i = 1; i < n; i++) {
int l = min(a[i], a[i - 1]);
int r = max(a[i], a[i - 1]);
osuL.add(l, 1);
osuR.add(r, 1);
}
while(m--) {
int type;
cin >> type;
if (type == 1) {
int pos, val;
cin >> pos >> val;
pos--;
if (pos > 0) {
osuL.add(min(a[pos], a[pos - 1]), -1);
osuR.add(max(a[pos], a[pos - 1]), -1);
}
if (pos < n - 1) {
osuL.add(min(a[pos], a[pos + 1]), -1);
osuR.add(max(a[pos], a[pos + 1]), -1);
}
a[pos] = val;
if (pos > 0) {
osuL.add(min(a[pos], a[pos - 1]), 1);
osuR.add(max(a[pos], a[pos - 1]), 1);
}
if (pos < n - 1) {
osuL.add(min(a[pos], a[pos + 1]), 1);
osuR.add(max(a[pos], a[pos + 1]), 1);
}
}
else {
int x;
cin >> x;
int ans = n - 1;
ans -= osuR.get(1, x);
ans -= osuL.get(x, N);
cout << ans << "\n";
}
}
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... |