コード例 #1
0
 public static void Run()
 {
     using (FastScanner fs = new FastScanner(new BufferedStream(Console.OpenStandardInput())))
     using (StreamWriter writer = new StreamWriter(new BufferedStream(Console.OpenStandardOutput())))
     {
         int n = fs.NextInt(), m = fs.NextInt(), bsize = (int)Math.Ceiling(Math.Sqrt(n));
         int[] a = new int[n];
         for (int i = 0; i < n; i++)
         {
             a[i] = fs.NextInt();
         }
         Query[] queries = new Query[m];
         for (int i = 0; i < m; i++)
         {
             int left = fs.NextInt() - 1, right = fs.NextInt() - 1;
             queries[i] = new Query { Id = i, Left = left, Right = right, Block = left / bsize };
         }
         queries = queries.OrderBy(q => q.Block).ThenBy(q => q.Right).ToArray();
         counts = new Dictionary<int, int>();
         int l = 0, r = 0;
         Add(a[0]);
         int[] answers = new int[m];
         foreach (Query q in queries)
         {
             while (r < q.Right)
             {
                 r++;
                 Add(a[r]);
             }
             while (r > q.Right)
             {
                 Remove(a[r]);
                 r--;
             }
             while (l < q.Left)
             {
                 Remove(a[l]);
                 l++;
             }
             while (l > q.Left)
             {
                 l--;
                 Add(a[l]);
             }
             answers[q.Id] = answer;
         }
         for (int i = 0; i < m; i++)
         {
             writer.WriteLine(answers[i]);
         }
     }
 }
コード例 #2
0
 public static void Run()
 {
     using (FastScanner fs = new FastScanner(new BufferedStream(Console.OpenStandardInput())))
     using (StreamWriter writer = new StreamWriter(new BufferedStream(Console.OpenStandardOutput())))
     {
         int n = fs.NextInt();
         int[] a = Array.ConvertAll(fs.ReadLine().Split(), Convert.ToInt32);
         int m = fs.NextInt();
         Query[] queries = new Query[m];
         for (int i = 0; i < m; i++)
         {
             queries[i] = new Query { Id = i, Left = fs.NextInt() - 1, Right = fs.NextInt() - 1};
         }
         queries = queries.OrderBy(q => q.Right).ToArray();
         int[] xor = new int[n];
         int[] answers = new int[m];
         xor[0] = a[0];
         for (int i = 1; i < n; i++)
         {
             xor[i] = xor[i - 1] ^ a[i];
         }
         Dictionary<int, int> lastPos = new Dictionary<int, int>();
         XorSegmentTreeFast distincts = new XorSegmentTreeFast(new int[n]);
         int r = -1;
         foreach (Query q in queries)
         {
             while (r < q.Right)
             {
                 r++;
                 if (lastPos.ContainsKey(a[r]))
                 {
                     distincts.Update(lastPos[a[r]], 0);
                     lastPos[a[r]] = r;
                 }
                 else
                 {
                     lastPos.Add(a[r], r);
                 }
                 distincts.Update(r, a[r]);
             }
             answers[q.Id] = q.Left > 0 ? xor[q.Right] ^ xor[q.Left - 1] : xor[q.Right];
             answers[q.Id] ^= distincts.QueryXor(q.Left, q.Right);
         }
         for (int i = 0; i < m; i++)
         {
             writer.WriteLine(answers[i]);
         }
     }
 }