結果
問題 | No.318 学学学学学 |
ユーザー |
![]() |
提出日時 | 2019-05-26 20:24:41 |
言語 | C (gcc 13.3.0) |
結果 |
AC
|
実行時間 | 43 ms / 2,000 ms |
コード長 | 1,981 bytes |
コンパイル時間 | 408 ms |
コンパイル使用メモリ | 31,616 KB |
実行使用メモリ | 5,376 KB |
最終ジャッジ日時 | 2024-09-17 15:22:18 |
合計ジャッジ時間 | 3,318 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge6 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 26 |
ソースコード
#include<stdio.h>#include<stdlib.h>#include<stdint.h>#include<inttypes.h>typedef int32_t i32;typedef i32 RUQ_val;typedef struct range_update_query {RUQ_val *val;int32_t size;int32_t bit;RUQ_val empty;} RUQ;RUQ* new_RUQ (const int32_t n) {int32_t k = 0;while ((1 << k) < n) ++k;RUQ *s = (RUQ *) calloc (1, sizeof (RUQ));s->val = (RUQ_val *) calloc (2 << k, sizeof (RUQ_val));s->size = 1 << k;s->bit = k;s->empty = -1;return s;}static inline void propagate (RUQ *s, int32_t k) {if (s->val[k] == s->empty) return;s->val[2 * k] = s->val[2 * k + 1] = s->val[k];s->val[k] = s->empty;}void update (RUQ *s, int32_t l, int32_t r, RUQ_val v) {for (int32_t i = s->bit; i > 0; --i) {propagate (s, (l + s->size) >> i);propagate (s, (r - 1 + s->size) >> i);}for (l += s->size, r += s->size; l < r; l >>= 1, r >>= 1) {if (l & 1) s->val[l++] = v;if (r & 1) s->val[--r] = v;}}RUQ_val find (RUQ *s, int32_t x) {x += s->size;for (int32_t i = s->bit; i >= 0; --i) {if (s->val[x >> i] != s->empty) {return s->val[x >> i];}}return s->empty;}typedef struct node {i32 v;i32 k;} node;int cmp_node (const void *a, const void *b) {i32 d = ((node *)a)->v - ((node *)b)->v;if (d != 0) return d < 0 ? -1 : 1;d = ((node *)a)->k - ((node *)b)->k;return d == 0 ? 0 : d < 0 ? -1 : 1;}void run (void) {i32 n;scanf ("%" SCNi32, &n);node *p = (node *) calloc (n, sizeof (node));for (i32 i = 0; i < n; ++i) {i32 a;scanf ("%" SCNi32, &a);p[i] = (node) {a, i};}qsort (p, n, sizeof (node), cmp_node);RUQ *s = new_RUQ (n);for (i32 i = 0; i < n;) {i32 j = i + 1;while (j < n && p[i].v == p[j].v) ++j;update (s, p[i].k, p[j - 1].k + 1, p[i].v);i = j;}for (i32 i = 0; i < n; ++i) {printf ("%" PRIi32, find (s, i));putchar (i == n - 1 ? '\n' : ' ');}}int main (void) {run();return 0;}