#include <bits/stdc++.h>
using namespace std;
#define int ll
typedef long long ll;
typedef long double ld;
typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<double> vd;
typedef vector<bool> vb;
typedef vector<char> vc;
typedef vector<string> vs;
typedef vector<pi> vp;
typedef vector<pl> vpl;
template<int MAXN>
struct segtr{
//To change the purpose of the segtree just redefine the operators
struct node{
int x;
node(int x = 0) : x(x) {}
node& operator+= (const node& other){
x += other.x;
return *this;
}
node operator+ (const node& other){
node tmp = *this;
return tmp += other;
}
};
node a[2*MAXN];
//Initialize the array
void init(){
for(int i = 1; i <= MAXN; ++i){
a[i+MAXN-1] = node{};
}
for(int i = MAXN-1; i > 0; --i){
a[i] = a[2*i] + a[2*i+1];
}
}
//Sets the node and updates the tree
void set(int pos, node val){
pos += MAXN-1;
a[pos] = val;
while(pos > 1){
pos /= 2;
a[pos] = a[2*pos] + a[2*pos+1];
}
}
inline void add(int pos, node val){ //Just forwards to set
set(pos, node{a[pos+MAXN-1]+val});
}
//Gets the range query
node get(int l, int r, int pos = 1, int rl = 1, int rr = MAXN){
if(r < rl || rr < l){ return node{}; }
if(l <= rl && rr <= r){ return a[pos]; }
int rm = (rl+rr)/2;
return get(l, r, 2*pos, rl, rm) + get(l, r, 2*pos+1, rm+1, rr);
}
};
segtr<131072> drvo;
void oduzmi(int a, int b){
//cout << "BRISI " << a << ' ' << b << endl;
if (a > b)
swap(a, b);
drvo.add(a, -1);
drvo.add(b+1, 1);
}
void dodaj(int a, int b){
//cout << "DODAJ " << a << ' ' << b << endl;
if (a > b)
swap(a, b);
drvo.add(a,1);
drvo.add(b,-1);
}
signed main()
{
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
cerr.tie(nullptr);
drvo.init();
int n, m;
cin >> n >> m;
vi a(n+1);
for (int i = 1; i <= n; ++i)
cin >> a[i];
for (int i = 2; i <= n; ++i){
dodaj(a[i-1],a[i]);
}
for (int e = 0; e < m; ++e){
int z;
cin >> z;
if (z == 2){
int h;
cin >> h;
cout << drvo.get(1, h).x << '\n';
continue;
}
int pos, val;
cin >> pos >> val;
if (pos > 1) oduzmi(a[pos], a[pos-1]);
if (pos < n) oduzmi(a[pos], a[pos+1]);
a[pos] = val;
if (pos > 1) dodaj(a[pos], a[pos-1]);
if (pos < n) dodaj(a[pos], a[pos+1]);
}
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
2412 KB |
Output is correct |
2 |
Runtime error |
5 ms |
4588 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
2412 KB |
Output is correct |
2 |
Runtime error |
5 ms |
4588 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
2412 KB |
Output is correct |
2 |
Runtime error |
5 ms |
4588 KB |
Execution killed with signal 11 (could be triggered by violating memory limits) |
3 |
Halted |
0 ms |
0 KB |
- |