Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Goal: Become better in CP!
- Key: Consistency and Discipline
- Desire: SDE @ Google USA
- Motto: Do what i Love <=> Love what i do
- If you don't use your brain 100%, it deteriorates gradually
- */
- import java.util.*;
- import java.io.*;
- import java.math.*;
- public class Solution {
- static StringBuffer str=new StringBuffer();
- static BufferedReader bf;
- static PrintWriter pw;
- static int n, q;
- static int a[];
- static long bit[][];
- static TreeMap<Long, Integer> revMp[];
- static long mp[][];
- static int t=10;
- static int mx=(int)1e6;
- static long query(long b[], int idx) {
- long sum = 0;
- idx++;
- while (idx > 0) {
- sum = (sum + b[idx]);
- idx -= (idx & (-idx));
- }
- return sum;
- }
- static void update(long b[], int idx, long v) {
- idx++;
- while (idx <= n) {
- b[idx] = (b[idx] + v);
- idx += (idx & (-idx));
- }
- }
- static void pre() throws Exception{
- // hash value is unique random integer for each value
- Random random=new Random(10);
- // reverse map
- revMp = new TreeMap[t];
- // map
- mp=new long[t][mx+1];
- for(int i=0;i<t;i++){
- revMp[i]=new TreeMap<>();
- for(int j=1;j<=mx;j++){
- do{
- mp[i][j]=random.nextInt();
- } while(revMp[i].containsKey(mp[i][j]));
- revMp[i].put(mp[i][j], j);
- }
- }
- }
- static void solve(int te) throws Exception{
- bit=new long[t][n+1];
- // stores hashes
- for(int i=0;i<10;i++){
- for(int j=0;j<n;j++){
- update(bit[i], j, mp[i][a[j]]);
- }
- }
- q=Integer.parseInt(bf.readLine().trim());
- int cnt=0;
- for(int i=0;i<q;i++){
- int type;
- String s[]=bf.readLine().trim().split("\\s+");
- type=Integer.parseInt(s[0]);
- if(type==1){
- int idx=Integer.parseInt(s[1]);
- idx--;
- int val=Integer.parseInt(s[2]);
- for(int j=0;j<t;j++){
- update(bit[j], idx, -mp[j][a[idx]]+mp[j][val]);
- }
- a[idx]=val;
- }else{
- int l, r;
- l=Integer.parseInt(s[1]);
- r=Integer.parseInt(s[2]);
- l--;
- r--;
- if(l==r){
- cnt++;
- continue;
- }
- if((r-l+1)%2==0) continue;
- boolean f1 = true, f2 = true;
- for(int j=0;j<t;j++){
- long left=query(bit[j], l+(r-l+1)/2-1)-query(bit[j], l-1);
- long right=query(bit[j], r)-query(bit[j], l+(r-l+1)/2-1);
- f1&=revMp[j].containsKey(right-left);
- // System.out.println(i+" "+(right-left));
- left=query(bit[j], l+(r-l+1)/2)-query(bit[j], l-1);
- right=query(bit[j], r)-query(bit[j], l+(r-l+1)/2);
- f2&=revMp[j].containsKey(-right+left);
- // System.out.println(i+" "+(-right+left));
- }
- if(f1 || f2) cnt++;
- }
- }
- str.append("Case #").append(te).append(": ").append(cnt).append("\n");
- }
- public static void main(String[] args) throws java.lang.Exception {
- boolean lenv=false;
- int te=1;
- if(lenv){
- bf = new BufferedReader(
- new FileReader("input.txt"));
- pw=new PrintWriter(new
- BufferedWriter(new FileWriter("output.txt")));
- }else{
- bf = new BufferedReader(new InputStreamReader(System.in));
- pw = new PrintWriter(new OutputStreamWriter(System.out));
- }
- pre();
- int q1 = Integer.parseInt(bf.readLine().trim());
- for(te=1;te<=q1;te++) {
- n=Integer.parseInt(bf.readLine().trim());
- String s[]=bf.readLine().trim().split("\\s+");
- a=new int[n];
- for(int i=0;i<n;i++) a[i]=Integer.parseInt(s[i]);
- solve(te);
- }
- pw.print(str);
- pw.flush();
- // System.out.println(str);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement