Submission #2138279


Source Code Expand

#include <bits/stdc++.h>

using namespace std;

template< typename Monoid >
struct SegmentTree
{
  using F = function< Monoid(Monoid, Monoid) >;

  int sz;
  vector< Monoid > seg;

  const F f;
  const Monoid M1;

  SegmentTree(int n, const F f, const Monoid &M1) : f(f), M1(M1)
  {
    sz = 1;
    while(sz < n) sz <<= 1;
    seg.assign(2 * sz, M1);
  }

  void set(int k, const Monoid &x)
  {
    seg[k + sz] = x;
  }

  void build()
  {
    for(int k = sz - 1; k > 0; k--) {
      seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]);
    }
  }

  void update(int k, const Monoid &x)
  {
    k += sz;
    seg[k] = x;
    while(k >>= 1) {
      seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]);
    }
  }

  Monoid query(int a, int b)
  {
    Monoid L = M1, R = M1;
    for(a += sz, b += sz; a < b; a >>= 1, b >>= 1) {
      if(a & 1) L = f(L, seg[a++]);
      if(b & 1) R = f(seg[--b], R);
    }
    return f(L, R);
  }

  Monoid operator[](const int &k) const
  {
    return seg[k + sz];
  }

  int binary_search(int &x, int k)
  {
    if(seg[k] < x) {
      x -= seg[k];
      return (-1);
    } else if(k >= sz) {
      return k - sz;
    } else {
      int left = binary_search(x, 2 * k);
      if(~left) return left;
      return binary_search(x, 2 * k + 1);
    }
  }
};

using int64 = long long;

int main()
{
  int Q;
  scanf("%d", &Q);
  SegmentTree< int > seg(200001, [](int a, int b) { return a + b; }, 0);
  while(Q--) {
    int T, X;
    scanf("%d %d", &T, &X);
    if(T == 1) {
      seg.update(X, seg[X] + 1);
    } else {
      int pos = seg.binary_search(X, 1);
      printf("%d\n", pos);
      seg.update(pos, seg[pos] - 1);
    }
  }
}

Submission Info

Submission Time
Task C - データ構造
User ei13333
Language C++14 (GCC 5.4.1)
Score 100
Code Size 1734 Byte
Status AC
Exec Time 73 ms
Memory 2944 KB

Compile Error

./Main.cpp: In function ‘int main()’:
./Main.cpp:79:18: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d", &Q);
                  ^
./Main.cpp:83:27: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d %d", &T, &X);
                           ^

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 100 / 100
Status
AC × 2
AC × 18
Set Name Test Cases
Sample sample_01.txt, sample_02.txt
All sample_01.txt, sample_02.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask1_13.txt, subtask1_14.txt, subtask1_15.txt, subtask1_16.txt
Case Name Status Exec Time Memory
sample_01.txt AC 2 ms 2304 KB
sample_02.txt AC 2 ms 2304 KB
subtask1_01.txt AC 2 ms 2304 KB
subtask1_02.txt AC 2 ms 2304 KB
subtask1_03.txt AC 2 ms 2304 KB
subtask1_04.txt AC 7 ms 2304 KB
subtask1_05.txt AC 13 ms 2432 KB
subtask1_06.txt AC 2 ms 2304 KB
subtask1_07.txt AC 38 ms 2432 KB
subtask1_08.txt AC 71 ms 2944 KB
subtask1_09.txt AC 73 ms 2944 KB
subtask1_10.txt AC 61 ms 2560 KB
subtask1_11.txt AC 61 ms 2560 KB
subtask1_12.txt AC 49 ms 2304 KB
subtask1_13.txt AC 73 ms 2944 KB
subtask1_14.txt AC 73 ms 2944 KB
subtask1_15.txt AC 59 ms 2944 KB
subtask1_16.txt AC 57 ms 2560 KB