Advertisement
Guest User

Untitled

a guest
Sep 25th, 2022
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 3.66 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 A2 {
  14.  
  15.   static StringBuffer str=new StringBuffer();
  16.   static BufferedReader bf;
  17.   static PrintWriter pw;
  18.   static int n, q;
  19.   static long a[];
  20.   static long bit[];
  21.   static long mod=(long)1e9+7;
  22.   static long mod2=(long)1e9+87;
  23.  
  24.   static long pow(long a, long b) {
  25.     long res = 1;
  26.     while (b > 0) {
  27.         if (b % 2 == 1) res = (res * a)%mod2;
  28.         a = (a * a)%mod2;
  29.         b = b >> 1l;
  30.     }
  31.     return res;
  32.   }
  33.  
  34.   static long query(int idx) {
  35.     long sum = 0;
  36.     idx++;
  37.     while (idx > 0) {
  38.         sum = (sum + bit[idx])%mod2;
  39.         idx -= (idx & (-idx));
  40.     }
  41.     return sum;
  42.   }
  43.   static void update(int idx, long v) {
  44.     idx++;
  45.     while (idx <= n) {
  46.         bit[idx] = (bit[idx] + v + mod2)%mod2;
  47.         idx += (idx & (-idx));
  48.     }
  49.   }
  50.   static void update(int l, int r, long v) {
  51.     update(l, v);
  52.     if ((r + 1) <= n) update(r + 1, -v);
  53.   }
  54.  
  55.   static int binarySearch(List<Long> l, int start, int end, long ele){
  56.     while(start<=end){
  57.       int mid=start+(end-start)/2;
  58.       if(l.get(mid).equals(ele)) return 1;
  59.       if(l.get(mid)<ele) return start=mid+1;
  60.       else end=mid-1;
  61.     }
  62.     return -1;
  63.   }
  64.  
  65.   static void solve(int te) throws Exception{
  66.     long b[]=new long[n];
  67.     // generate hash
  68.     for(int i=0;i<n;i++) b[i]=pow(mod, a[i]-1)%mod2;
  69.     bit=new long[n+1];
  70.     List<Long> hash=new ArrayList<>();
  71.     for(int i=0;i<n;i++) hash.add(pow(mod, i)%mod2);
  72.     Collections.sort(hash);
  73.     // stores hashes
  74.     for(int i=0;i<n;i++){
  75.       update(i, b[i]);
  76.     }
  77.     q=Integer.parseInt(bf.readLine().trim());
  78.     int cnt=0;
  79.     for(int i=0;i<q;i++){
  80.       int type;
  81.       String s[]=bf.readLine().trim().split("\\s+");
  82.       type=Integer.parseInt(s[0]);
  83.       if(type==1){
  84.         int idx=Integer.parseInt(s[1]);
  85.         idx--;
  86.         long val=Long.parseLong(s[2]);
  87.         update(idx, -b[idx]);
  88.         update(idx, val);
  89.         b[idx]=val;
  90.       }else{
  91.         int l, r;
  92.         l=Integer.parseInt(s[1]);
  93.         r=Integer.parseInt(s[2]);
  94.         l--;
  95.         r--;
  96.         int len=r-l+1;
  97.         if(len%2==0){
  98.           continue;
  99.         }else{
  100.           for(int x=l+len/2;x<=l+len/2+1;x++){
  101.             long left=query(x-1)-query(l-1);
  102.             long right=query(r)-query(x-1);
  103.             long val=(x == l + len / 2 ? (right-left+mod2)%mod2 : (left-right+mod2)%mod2);
  104.             if(binarySearch(hash, l, r, val) != -1){
  105.               cnt++;
  106.               break;
  107.             }
  108.           }
  109.         }
  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=true;
  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.     int q1 = Integer.parseInt(bf.readLine().trim());
  129.     for(te=1;te<=q1;te++) {
  130.       n=Integer.parseInt(bf.readLine().trim());
  131.       String s[]=bf.readLine().trim().split("\\s+");
  132.       a=new long[n];
  133.       for(int i=0;i<n;i++) a[i]=Long.parseLong(s[i]);
  134.       solve(te);
  135.     }
  136.     pw.print(str);
  137.     pw.flush();
  138.     // System.out.println(str);
  139.   }
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement