POJ2777线段树

来源:互联网 发布:怎么清楚手机应用数据 编辑:程序博客网 时间:2024/05/27 09:48

C A B C:区间【A,B】内涂上颜色C。

P A B:查询区间【A,B】内颜色种类数。

import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.io.PrintWriter;import java.math.BigInteger;import java.util.StringTokenizer;public class Main {public static void main(String[] args) {new Task().solve() ;}}class Task{InputReader in = new InputReader(System.in) ;PrintWriter out = new PrintWriter(System.out) ;void solve(){int L = in.nextInt() ;in.nextInt() ;int O = in.nextInt() ;add = new int[L<<2] ;sum = new int[L<<2] ;build(1 , L , 1) ;while(O-- > 0){char type = in.next().charAt(0) ;int l = in.nextInt() ;int r = in.nextInt() ;if(l > r){int oo = l ;l = r ;r= oo ;}if('C' == type) update(l , r , in.nextInt() , 1 , L , 1) ;else out.println(Integer.bitCount(query(l , r , 1 , L , 1))) ;}        out.flush() ; }int[]  add , sum ;void up(int t){sum[t] = sum[t<<1] | sum[t<<1|1] ;}void down(int t){if(add[t] > 0){add[t<<1] = add[t<<1|1] = sum[t<<1] = sum[t<<1|1] = add[t] ;add[t] = 0 ;}}void build(int l , int r , int t){add[t] = 0 ;sum[t] = 1 ;if(l == r) return ;int mid = (l + r) >> 1 ;build(l , mid , t<<1) ;build(mid+1 , r , t<<1|1) ;up(t) ;}void update(int L , int R , int c , int l , int r , int t){if(L <= l && r <= R){add[t] = sum[t] = 1 << (c-1) ;return ;}down(t) ;int mid = (l + r) >> 1 ;if(L <= mid) update(L , R , c , l , mid , t<<1) ;if(R > mid) update(L , R , c , mid+1 , r , t<<1|1) ;up(t) ; }int query(int L , int R , int l , int r , int t){if(L <= l && r <= R) return sum[t] ;down(t) ; int ret = 0 ;int mid = (l + r) >> 1 ;if(L <= mid) ret |= query(L , R , l , mid , t<<1) ;if(R > mid) ret |= query(L , R , mid+1 , r , t<<1|1) ;return ret ; }}class InputReader {      public BufferedReader reader;      public StringTokenizer tokenizer;        public InputReader(InputStream stream) {          reader = new BufferedReader(new InputStreamReader(stream), 32768);          tokenizer = new StringTokenizer("");      }        private void eat(String s) {          tokenizer = new StringTokenizer(s);      }        public String nextLine() {          try {              return reader.readLine();          } catch (Exception e) {              return null;          }      }        public boolean hasNext() {          while (!tokenizer.hasMoreTokens()) {              String s = nextLine();              if (s == null)                  return false;              eat(s);          }          return true;      }        public String next() {          hasNext();          return tokenizer.nextToken();      }        public int nextInt() {          return Integer.parseInt(next());      }        public long nextLong() {          return Long.parseLong(next());      }        public double nextDouble() {          return Double.parseDouble(next());      }        public BigInteger nextBigInteger() {          return new BigInteger(next());      }    }  



0 0