Advertisement
Ganesh1648

Untitled

Oct 15th, 2022
1,204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.73 KB | None | 0 0
  1. /*
  2.   Goal: Become better in CP!
  3.   Key: Consistency and Discipline
  4.   Desire: SDE @ Google USA
  5.   Motto: Do what i Love <=> Love what i do
  6.   If you don't use your brain 100%, it deteriorates gradually
  7. */
  8.  
  9. import java.util.*;
  10. import java.io.*;
  11. import java.math.*;
  12.  
  13. public class Solution {
  14.  
  15.   static StringBuffer str=new StringBuffer();
  16.   static BufferedReader bf;
  17.   static PrintWriter pw;
  18.   static int n, q;
  19.   static int a[];
  20.   static long bit[][];
  21.   static TreeMap<Long, Integer> revMp[];
  22.   static long mp[][];
  23.   static int t=10;
  24.   static int mx=(int)1e6;
  25.  
  26.   static long query(long b[], int idx) {
  27.     long sum = 0;
  28.     idx++;
  29.     while (idx > 0) {
  30.         sum = (sum + b[idx]);
  31.         idx -= (idx & (-idx));
  32.     }
  33.     return sum;
  34.   }
  35.   static void update(long b[], int idx, long v) {
  36.     idx++;
  37.     while (idx <= n) {
  38.         b[idx] = (b[idx] + v);
  39.         idx += (idx & (-idx));
  40.     }
  41.   }
  42.  
  43.   static void pre() throws Exception{
  44.  
  45.     // hash value is unique random integer for each value
  46.     Random random=new Random(10);
  47.     // reverse map
  48.     revMp = new TreeMap[t];
  49.  
  50.     // map
  51.     mp=new long[t][mx+1];
  52.     for(int i=0;i<t;i++){
  53.       revMp[i]=new TreeMap<>();
  54.       for(int j=1;j<=mx;j++){
  55.         do{
  56.           mp[i][j]=random.nextInt();
  57.         } while(revMp[i].containsKey(mp[i][j]));
  58.         revMp[i].put(mp[i][j], j);
  59.       }
  60.     }
  61.   }
  62.  
  63.   static void solve(int te) throws Exception{
  64.     bit=new long[t][n+1];
  65.    
  66.     // stores hashes
  67.     for(int i=0;i<10;i++){
  68.       for(int j=0;j<n;j++){
  69.         update(bit[i], j, mp[i][a[j]]);
  70.       }
  71.     }
  72.  
  73.     q=Integer.parseInt(bf.readLine().trim());
  74.     int cnt=0;
  75.     for(int i=0;i<q;i++){
  76.       int type;
  77.       String s[]=bf.readLine().trim().split("\\s+");
  78.       type=Integer.parseInt(s[0]);
  79.       if(type==1){
  80.         int idx=Integer.parseInt(s[1]);
  81.         idx--;
  82.         int val=Integer.parseInt(s[2]);
  83.         for(int j=0;j<t;j++){
  84.           update(bit[j], idx, -mp[j][a[idx]]+mp[j][val]);
  85.         }
  86.         a[idx]=val;
  87.       }else{
  88.         int l, r;
  89.         l=Integer.parseInt(s[1]);
  90.         r=Integer.parseInt(s[2]);
  91.         l--;
  92.         r--;
  93.         if(l==r){
  94.           cnt++;
  95.           continue;
  96.         }
  97.         if((r-l+1)%2==0) continue;
  98.         boolean f1 = true, f2 = true;
  99.         for(int j=0;j<t;j++){
  100.           long left=query(bit[j], l+(r-l+1)/2-1)-query(bit[j], l-1);
  101.           long right=query(bit[j], r)-query(bit[j], l+(r-l+1)/2-1);
  102.           f1&=revMp[j].containsKey(right-left);
  103.           // System.out.println(i+" "+(right-left));
  104.           left=query(bit[j], l+(r-l+1)/2)-query(bit[j], l-1);
  105.           right=query(bit[j], r)-query(bit[j], l+(r-l+1)/2);
  106.           f2&=revMp[j].containsKey(-right+left);
  107.           // System.out.println(i+" "+(-right+left));
  108.         }
  109.         if(f1 || f2) cnt++;
  110.       }
  111.     }
  112.     str.append("Case #").append(te).append(": ").append(cnt).append("\n");
  113.   }
  114.  
  115.   public static void main(String[] args) throws java.lang.Exception {
  116.     boolean lenv=false;
  117.     int te=1;
  118.     if(lenv){
  119.       bf = new BufferedReader(
  120.                           new FileReader("input.txt"));
  121.       pw=new PrintWriter(new
  122.             BufferedWriter(new FileWriter("output.txt")));
  123.     }else{
  124.       bf = new BufferedReader(new InputStreamReader(System.in));
  125.       pw = new PrintWriter(new OutputStreamWriter(System.out));
  126.     }
  127.  
  128.     pre();
  129.     int q1 = Integer.parseInt(bf.readLine().trim());
  130.     for(te=1;te<=q1;te++) {
  131.       n=Integer.parseInt(bf.readLine().trim());
  132.       String s[]=bf.readLine().trim().split("\\s+");
  133.       a=new int[n];
  134.       for(int i=0;i<n;i++) a[i]=Integer.parseInt(s[i]);
  135.       solve(te);
  136.     }
  137.     pw.print(str);
  138.     pw.flush();
  139.     // System.out.println(str);
  140.   }
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement