Advertisement
Morass

ADAUNIQ

Jun 29th, 2017
188
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.67 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define PB push_back
  4. #define ZERO (1e-10)
  5. #define INF (1<<29)
  6. #define CL(A,I) (memset(A,I,sizeof(A)))
  7. #define DEB printf("DEB!\n");
  8. #define D(X) cout<<"  "<<#X": "<<X<<endl;
  9. #define EQ(A,B) (A+ZERO>B&&A-ZERO<B)
  10. typedef long long ll;
  11. typedef pair<ll,ll> pll;
  12. typedef vector<int> vi;
  13. typedef pair<int,int> ii;
  14. typedef vector<ii> vii;
  15. #define IN(n) int n;scanf("%d",&n);
  16. #define FOR(i, m, n) for (int i(m); i < n; i++)
  17. #define F(n) FOR(i,0,n)
  18. #define FF(n) FOR(j,0,n)
  19. #define FT(m, n) FOR(k, m, n)
  20. #define aa first
  21. #define bb second
  22. void ga(int N,int *A){F(N)scanf("%d",A+i);}
  23. #define MX (200005)
  24. #define SQ (4048)
  25. #define SZ (MX/SQ+1)
  26. int H[MX*2];
  27. struct MO{
  28.     struct MOQ{int b,e,i,j;};
  29.     vector<MOQ> T[SZ][SZ];
  30.     int A[MX],L,N,K,M,U[MX],t[MX],X[MX];
  31.     void CLR(){L=N=K=M=0;F(SZ)FF(SZ)T[i][j].clear();}
  32.     void ADD(int a){A[N++]=a;}
  33.     void QY(int b,int e){T[b/SQ][e/SQ].PB({min(b,e),max(b,e),M++,++L});}
  34.     void UD(int b,int v){X[K]=b,U[K]=v,t[K++]=++L;}
  35.     int GO(int*O){
  36.         int b,e;
  37.         st();
  38.         F(SZ)FF(SZ)if(!T[i][j].empty())b=e=T[i][j][0].b-1,i=j=INF;
  39.         F(SZ)FF(SZ)if(!T[i][j].empty())pro(T[i][j],b,e,O);
  40.         return M;
  41.     }
  42.     void pro(vector<MOQ>&T,int&b,int&e,int*O){
  43.         int I=0;
  44.         F((int)T.size()){
  45.             while(b>=T[i].b)add(b--);
  46.             while(e<T[i].e)add(++e);
  47.             while(b+1<T[i].b)del(++b);
  48.             while(e>T[i].e)del(e--);
  49.             while(I<K&&T[i].j>t[I]){
  50.                 if(X[I]>b&&X[I]<=e)del(X[I]);
  51.                 swap(A[X[I]],U[I]);
  52.                 if(X[I]>b&&X[I]<=e)add(X[I]);
  53.                 ++I;
  54.             }
  55.             O[T[i].i]=ans();
  56.         }
  57.         while(~--I){
  58.             if(X[I]>b&&X[I]<=e)del(X[I]);
  59.             swap(A[X[I]],U[I]);
  60.             if(X[I]>b&&X[I]<=e)add(X[I]);
  61.         }
  62.     }
  63.     //MO
  64.     int P,Z[MX];
  65.     void add(int w){
  66.         w=A[w];
  67. //        printf("ADD: %d\n",w);
  68.         if(++Z[w]==1)++P;
  69.         else if(Z[w]==2)--P;
  70.     }
  71.     void del(int w){
  72.         w=A[w];
  73. //        printf("DEL: %d\n",w);
  74.         if(!--Z[w])--P;
  75.         else if(Z[w]==1)++P;
  76.     }
  77.     int ans(){
  78. //        printf("  ANS: %d\n",P);
  79.         return P;
  80.     }
  81.     void st(){}
  82. }T;
  83. int N,Q,a,b,c,O[MX];
  84. int main(void){
  85.     scanf("%d%d",&N,&Q),T.CLR(),assert(0<N&&0<Q&&N<=2e5&&Q<=2e5);//ASS
  86.     F(N)scanf("%d",&a),assert(a>=0&&a<=2e5),T.ADD(a);//ASS
  87.     F(Q){
  88.         scanf("%d%d%d",&a,&b,&c);
  89.         assert(a==1||a==2);//ASS
  90.         if(a-1)T.QY(b,c),assert(b>=0&&b<=c&&c<N);
  91.         else T.UD(b,c),assert(b<N&&b>=0&&c>=0&&c<=2e5);
  92.     }
  93.     a=T.GO(O);
  94.     F(a)printf("%d\n",O[i]);
  95.     return 0;
  96. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement