Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- ┓┏┓┏┓┃
- ┛┗┛┗┛┃
- ┓┏┓┏┓┃
- ┛┗┛┗┛┃
- ┓┏┓┏┓┃\○/
- ┛┗┛┗┛┃ / /
- ┓┏┓┏┓┃ノ
- ┛┗┛┗┛┃
- ┓┏┓┏┓┃
- ┛┗┛┗┛┃
- ┓┏┓┏┓┃
- ┛┗┛┗┛┃
- ┓┏┓┏┓┃
- ┛┗┛┗┛┃
- ┓┏┓┏┓┃┓
- ┛┗┛┗┛┃┃
- MIPTCLASSICMIPTCLASSICMIPTCLASSICMIPTCLASSICMIPTCLASSICMIPTCLASSIC
- */
- // #define pragma
- #ifdef pragma
- #pragma GCC optimize("Ofast")
- #pragma GCC optimize("no-stack-protector")
- #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
- #pragma GCC optimize("unroll-loops")
- #pragma GCC diagnostic ignored "-Wunused-result"
- #endif // pragma
- #include<bits/stdc++.h>
- #include <ext/pb_ds/assoc_container.hpp>
- #include <ext/pb_ds/tree_policy.hpp>
- #define ll long long
- #define all(x) begin(x), end(x)
- #define pb push_back
- #define x first
- #define y second
- #define int long long
- #define zero(two) memset(two, 0, sizeof(two))
- using namespace std;
- using namespace __gnu_pbds;
- typedef vector<int> vi;
- typedef vector<bool> vb;
- typedef pair<int, int> pii;
- typedef long double ld;
- typedef vector<vi> matrix;
- template<typename T>
- using kawaii_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
- const ld PI = atan2(0, -1);
- void seriy() {
- ios::sync_with_stdio(0);
- cin.tie(0);
- cout.tie(0);
- cout << fixed << setprecision(10);
- #if 0
- freopen("input", "r", stdin);
- freopen("output", "w", stdout);
- #endif
- }
- /** Fast input-output */
- template <class T = int> inline T readInt();
- inline double readDouble();
- inline int readUInt();
- inline int readChar(); // first non-blank character
- inline void readWord( char *s );
- inline bool readLine( char *s ); // do not save '\n'
- inline bool isEof();
- inline int getChar();
- inline int peekChar();
- inline bool seekEof();
- inline void skipBlanks();
- template <class T> inline void writeInt( T x, char end = 0, int len = -1 );
- inline void writeChar( int x );
- inline void writeWord( const char *s );
- inline void writeDouble( double x, int len = 0 );
- inline void flush();
- static struct buffer_flusher_t {
- ~buffer_flusher_t() {
- flush();
- }
- } buffer_flusher;
- /** Read */
- static const int buf_size = 4096;
- static unsigned char buf[buf_size];
- static int buf_len = 0, buf_pos = 0;
- inline bool isEof() {
- if (buf_pos == buf_len) {
- buf_pos = 0, buf_len = fread(buf, 1, buf_size, stdin);
- if (buf_pos == buf_len)
- return 1;
- }
- return 0;
- }
- inline int getChar() {
- return isEof() ? -1 : buf[buf_pos++];
- }
- inline int peekChar() {
- return isEof() ? -1 : buf[buf_pos];
- }
- inline bool seekEof() {
- int c;
- while ((c = peekChar()) != -1 && c <= 32)
- buf_pos++;
- return c == -1;
- }
- inline void skipBlanks() {
- while (!isEof() && buf[buf_pos] <= 32U)
- buf_pos++;
- }
- inline int readChar() {
- int c = getChar();
- while (c != -1 && c <= 32)
- c = getChar();
- return c;
- }
- inline int readUInt() {
- int c = readChar(), x = 0;
- while ('0' <= c && c <= '9')
- x = x * 10 + c - '0', c = getChar();
- return x;
- }
- template <class T>
- inline T readInt() {
- int s = 1, c = readChar();
- T x = 0;
- if (c == '-')
- s = -1, c = getChar();
- else if (c == '+')
- c = getChar();
- while ('0' <= c && c <= '9')
- x = x * 10 + c - '0', c = getChar();
- return s == 1 ? x : -x;
- }
- inline double readDouble() {
- int s = 1, c = readChar();
- double x = 0;
- if (c == '-')
- s = -1, c = getChar();
- while ('0' <= c && c <= '9')
- x = x * 10 + c - '0', c = getChar();
- if (c == '.') {
- c = getChar();
- double coef = 1;
- while ('0' <= c && c <= '9')
- x += (c - '0') * (coef *= 1e-1), c = getChar();
- }
- return s == 1 ? x : -x;
- }
- inline void readWord( char *s ) {
- int c = readChar();
- while (c > 32)
- *s++ = c, c = getChar();
- *s = 0;
- }
- inline bool readLine( char *s ) {
- int c = getChar();
- while (c != '\n' && c != -1)
- *s++ = c, c = getChar();
- *s = 0;
- return c != -1;
- }
- /** Write */
- static int write_buf_pos = 0;
- static char write_buf[buf_size];
- inline void writeChar( int x ) {
- if (write_buf_pos == buf_size)
- fwrite(write_buf, 1, buf_size, stdout), write_buf_pos = 0;
- write_buf[write_buf_pos++] = x;
- }
- inline void flush() {
- if (write_buf_pos)
- fwrite(write_buf, 1, write_buf_pos, stdout), write_buf_pos = 0;
- }
- template <class T>
- inline void writeInt( T x, char end, int output_len ) {
- if (x < 0)
- writeChar('-'), x = -x;
- char s[24];
- int n = 0;
- while (x || !n)
- s[n++] = '0' + x % 10, x /= 10;
- while (n < output_len)
- s[n++] = '0';
- while (n--)
- writeChar(s[n]);
- if (end)
- writeChar(end);
- }
- inline void writeWord( const char *s ) {
- while (*s)
- writeChar(*s++);
- }
- inline void writeDouble( double x, int output_len ) {
- if (x < 0)
- writeChar('-'), x = -x;
- int t = (int)x;
- writeInt(t), x -= t;
- writeChar('.');
- for (int i = output_len - 1; i > 0; i--) {
- x *= 10;
- t = std::min(9ll, (int)x);
- writeChar('0' + t), x -= t;
- }
- x *= 10;
- t = std::min(9ll, (int)(x + 0.5));
- writeChar('0' + t);
- }
- struct rrq {
- int t, l, r, id;
- };
- struct crq {
- int t, pos, val;
- };
- const int INF = 1e9 + 7;
- const int MAXN = 1e6 + 100;
- int k, kt;
- vi addpos;
- matrix add;
- vi a, ccc(MAXN);
- int curpos = 0;
- vector<crq> crqs;
- int curl = 1, curr = 0, curt = 0;
- bool cmp(rrq a, rrq b) {
- if(a.t / kt != b.t / kt) {
- return a.t < b.t;
- }
- else if(a.l / k != b.l / k) {
- return a.l < b.l;
- }
- return a.r < b.r;
- }
- void addLeft(int pos) {
- pos = a[pos];
- ccc[pos]++;
- if(pos == curpos) {
- while(ccc[curpos]) {
- curpos++;
- }
- }
- }
- void addRight(int pos) {
- addLeft(pos);
- }
- void delLeft(int pos) {
- pos = a[pos];
- ccc[pos]--;
- if(ccc[pos] == 0 && pos < curpos) {
- curpos = pos;
- }
- }
- void delRight(int pos) {
- delLeft(pos);
- }
- void addT(int num) {
- int pos = crqs[num].pos;
- int val = crqs[num].val;
- if(pos >= curl && pos <= curr) {
- delLeft(pos);
- }
- addpos[pos]++;
- a[pos] = val;
- if(pos >= curl && pos <= curr) {
- addLeft(pos);
- }
- }
- void delT(int num) {
- int pos = crqs[num].pos;
- if(pos >= curl && pos <= curr) {
- ccc[a[pos]]--;
- if(ccc[a[pos]] == 0 && a[pos] < curpos) {
- curpos = a[pos];
- }
- }
- addpos[pos]--;
- a[pos] = add[pos][addpos[pos]];
- if(pos >= curl && pos <= curr) {
- addLeft(pos);
- }
- }
- int answer() {
- return curpos;
- }
- signed main() {
- seriy();
- int n, q;
- n = readInt();
- q = readInt();
- a.resize(n);
- add.resize(n);
- addpos.resize(n, 0);
- for(int i = 0; i < n; i++) {
- a[i] = readInt();
- add[i].pb(a[i]);
- }
- vi l(q), r(q);
- int tt = 0;
- vector<rrq> rqs;
- for(int i = 0; i < q; i++) {
- char rq;
- rq = readChar();
- l[i] = readInt();
- r[i] = readInt();
- l[i]--;
- if(rq == '!') {
- crqs.pb({tt + 1, l[i], r[i]});
- add[l[i]].pb(r[i]);
- // cerr << l[i] << " " << r[i] << '\n';
- tt++;
- }
- else {
- r[i]--;
- rqs.pb({tt, l[i], r[i], i});
- }
- }
- int num = 0;
- k = pow(n, 2. / 3.);
- kt = pow(tt, 2. / 3.) + 1;
- sort(all(rqs), cmp);
- vi ans(q, -1);
- for(int i = 0; i < rqs.size(); i++) {
- while(curl > rqs[i].l) {
- curl--;
- addLeft(curl);
- }
- while(curr < rqs[i].r) {
- curr++;
- addRight(curr);
- }
- while(curl < rqs[i].l) {
- delLeft(curl);
- curl++;
- }
- while(curr > rqs[i].r) {
- delRight(curr);
- curr--;
- }
- while(curt < rqs[i].t) {
- addT(curt);
- curt++;
- }
- while(curt > rqs[i].t) {
- curt--;
- delT(curt);
- }
- // for(auto j : a) {
- // cerr << j << " ";
- // }
- // cerr << '\n';
- // cerr << rqs[i].t << " " << rqs[i].l << " " << rqs[i].r << " " << answer() << '\n';
- ans[rqs[i].id] = answer();
- }
- for(auto i : ans) {
- if(i != -1) {
- writeInt(i);
- writeChar('\n');
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement