Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int ST_SIZE = 2097152;
- int st[ST_SIZE];
- int leftmost[ST_SIZE];
- int rightmost[ST_SIZE];
- int p[200000];
- char t[200000];
- int a[200000];
- int b[200000];
- int dif[600000];
- int n, q, n2;
- int tam;
- void preprocesamiento()
- {
- int tamDif = 0;
- unordered_map <int, int> mapa;
- scanf("%d %d", &n, &q);
- for(int i=0; i<n; i++)
- {
- scanf("%d", &p[i]);
- dif[tamDif++] = p[i];
- }
- for(int i=0; i<q; i++)
- {
- scanf(" %c %d %d", &t[i], &a[i], &b[i]);
- if(t[i] == '?')
- dif[tamDif++] = a[i];
- dif[tamDif++] = b[i];
- }
- sort(dif, dif+tamDif);
- int valor = 2;
- mapa[dif[0]] = 1;
- for(int i=1; i<tamDif; i++)
- {
- valor += dif[i] != dif[i-1];
- mapa[dif[i]] = valor;
- }
- for(int i=0; i<n; i++)
- p[i] = mapa[p[i]];
- for(int i=0; i<q; i++)
- {
- if(t[i] == '?')
- a[i] = mapa[a[i]];
- b[i] = mapa[b[i]];
- }
- tam = mapa.size();
- }
- int sigPot2(int val)
- {
- int pot = 1;
- while(pot < val)
- pot *= 2;
- return pot;
- }
- int valUpdate;
- int pos;
- int update(int nodo)
- {
- if(nodo == pos && nodo >= n2)
- {
- st[nodo] += valUpdate; ///sumar o restar
- return st[nodo];
- }
- if(leftmost[nodo] <= pos && pos <= rightmost[nodo])
- {
- st[nodo] = update(nodo<<1) + update((nodo<<1)|1);
- }
- return st[nodo];
- }
- int l, r;
- int query(int nodo)
- {
- ///Si el rango está completamente contenido
- if(l <= leftmost[nodo] && rightmost[nodo] <= r)
- return st[nodo];
- ///Si no se superponen
- if(rightmost[nodo] < l || leftmost[nodo] > r)
- return 0;
- return query(nodo<<1)+query((nodo<<1)|1);
- }
- int main()
- {
- preprocesamiento();
- n2 = sigPot2(tam);
- for(int i=n2; i<n2*2; i++)
- leftmost[i] = rightmost[i] = i;
- for(int i=n2-1; i>=1; i--)
- {
- leftmost[i] = leftmost[i<<1];
- rightmost[i] = rightmost[(i<<1)|1];
- }
- for(int i=0; i<n; i++)
- {
- valUpdate = 1;
- pos = n2+p[i]-1;
- update(1);
- }
- for(int i=0; i<q; i++)
- {
- if(t[i] == '!')
- {
- valUpdate = -1;
- pos = n2+p[a[i]-1]-1;
- update(1);
- p[a[i]-1] = b[i];
- valUpdate = 1;
- pos = n2+p[a[i]-1]-1;
- update(1);
- }
- else
- {
- l = n2+a[i]-1;
- r = n2+b[i]-1;
- printf("%d\n", query(1));
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment