Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- typedef long long ll;
- #define F first
- #define S second
- using namespace std;
- int ltx(vector<pair<ll, int>> v, ll x){
- int s = 0, e = v.size()-1;
- int ans = -1;
- while(e >= s){
- int m = s+(e-s)/2;
- if(v[m].F <= x){
- ans = m;
- s = m+1;
- } else{
- e = m-1;
- }
- }
- return ans;
- }
- struct Node {
- vector<pair<ll, int>> v;
- void setSize(int n) {
- v.assign(n, {1000000007, 0});
- for(int i = 0; i < n; i++) {
- v[i] = {1000000007, i};
- }
- }
- };
- struct segTree {
- int size = 1;
- vector<Node> nodes;
- Node NEUTRAL;
- void init(int n) {
- while(size < n) {
- size *= 2;
- }
- NEUTRAL.setSize(1);
- nodes.assign(2*size, NEUTRAL);
- }
- Node merge(Node a, Node b) {
- Node fin; fin.setSize(a.v.size()+b.v.size());
- int i = 0, j = 0, k = 0;
- while(i < a.v.size() && j < b.v.size() && k < fin.v.size()) {
- if(a.v[i].F < b.v[j].F) {
- fin.v[k] = a.v[i];
- i++;
- } else {
- fin.v[k] = b.v[j];
- j++;
- }
- k++;
- }
- while(i < a.v.size() && k < fin.v.size()) {
- fin.v[k] = a.v[i];
- i++; k++;
- }
- while(j < a.v.size() && k < fin.v.size()) {
- fin.v[k] = b.v[j];
- j++; k++;
- }
- return fin;
- }
- void set(int i, ll val, int x, int lx, int rx) {
- if(rx-lx == 1) {
- nodes[x].v[0] = {val, i};
- return;
- }
- int m = (lx+rx)/2;
- if(i < m) {
- set(i, val, 2*x+1, lx, m);
- } else {
- set(i, val, 2*x+2, m, rx);
- }
- nodes[x] = merge(nodes[2*x+1], nodes[2*x+2]);
- }
- void set(int i, ll val) {
- set(i, val, 0, 0, size);
- }
- Node getNode(int l, int r, int x, int lx, int rx) {
- if(lx >= r || rx <= l) {
- return NEUTRAL;
- }
- if(l <= lx && rx <= r) {
- return nodes[x];
- }
- int m = (lx+rx)/2;
- return merge(getNode(l, r, 2*x+1, lx, m), getNode(l, r, 2*x+2, m, rx));
- }
- Node getNode(int l, int r) {
- return getNode(l, r, 0, 0, size);
- }
- };
- int main(){
- ios_base::sync_with_stdio(false);
- cin.tie(NULL); cout.tie(NULL);
- int n, m; cin >> n >> m;
- segTree st; st.init(n);
- while(m--) {
- int op; cin >> op;
- if(op == 1) {
- int i; ll val;
- cin >> i >> val;
- st.set(i, val);
- } else {
- int l, r; ll p;
- cin >> l >> r >> p;
- Node ans = st.getNode(l, r);
- int temp = ltx(ans.v, p);
- cout << ltx(ans.v, p)+1 << "\n";
- for(int i = 0; i <= temp; i++) {
- st.set(ans.v[i].S, 1000000009);
- }
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement