昊昊喜歡運動c++
他N天內會參加M種運動(每種運動用一個[1,m]的整數表示)ui
如今有Q個操做,操做描述以下spa
輸入兩個數N, M (1≤N≤105, 1≤M≤100);code
輸入N個數ai(ai∈[1,m])表示在第i天昊昊作了第ai類型的運動;blog
輸入一個數Q(1≤Q≤105);input
輸入Q行 每行描述如下兩種操做it
M l r x
,表示昊昊把第l天到第r天的運動所有換成了x(x∈[1,m])Q l r
,表示昊昊想知道他第l天到第r天參加了多少種不一樣的運動對於全部的Q操做,每一行輸出一個數 表示昊昊在第l天到第r天一共作了多少種活動table
Sample Input | Sample Output |
---|---|
5 3 1 2 3 2 3 4 Q 1 4 Q 2 4 M 5 5 2 Q 1 5 |
3 2 3 |
/********************************************************* * --------------Alfheim-------------- * * author AbyssalFish * **********************************************************/ #include<bits/stdc++.h> using namespace std; typedef long long ll; const int MAX_N = 1e5+5, MAX_M = 100+28; int N, M; int a[MAX_N]; #define para int o = 1, int l = 1, int r = N #define lo (o<<1) #define ro (o<<1|1) #define Tvar int md = (l+r)>>1; #define lsn lo,l,md #define rsn ro,md+1,r #define insd ql <= l && r <= qr const int ST_SIZE = 1<<18; int S[ST_SIZE]; bitset<MAX_M> E[ST_SIZE]; inline void sink(int o,int s) { E[o].reset(); E[o].set(S[o] = s); } void build(para) { if(l == r){ E[o].set(a[l]); } else { Tvar build(lsn); build(rsn); E[o] = E[lo] | E[ro]; } } inline void push_down(int o) { if(S[o]){ sink(lo,S[o]); sink(ro,S[o]); S[o] = 0; } } bitset<MAX_M> res; int ql,qr; void query(para) { if(insd){ res |= E[o]; } else { push_down(o); Tvar if(ql <= md) query(lsn); if(qr > md) query(rsn); } } int qval; void modify(para) { if(insd){ sink(o,qval); } else { push_down(o); Tvar if(ql <= md) modify(lsn); if(qr > md) modify(rsn); E[o] = E[lo] | E[ro]; } } //#define LOCAL int main() { #ifdef LOCAL freopen("data.txt","r",stdin); #endif scanf("%d%d",&N,&M); for(int i = 1; i <= N; i++) scanf("%d",a+i); build(); int Q; scanf("%d",&Q); char op[2]; while(Q--){ scanf("%s%d%d",op,&ql,&qr); if(*op == 'Q'){ res.reset(); query(); printf("%d\n", res.count()); } else { scanf("%d",&qval); modify(); } } return 0; }