1 module dkh.segtree.naive;
2 
3 static struct NaiveSimple(T, alias opTT, T eT) {
4     import std.conv : to;
5     alias DataType = T;
6     alias LazyType = void;
7     alias BinSearch = binSearchNaive;
8     T[] d;
9     @property size_t length() const { return d.length; }
10     this(uint n) {
11         d = new T[n];
12     }
13     this(T[] first) {
14         d = first.dup;
15     }
16     const(T) sum(uint l, uint r) {
17         T sm = eT;
18         foreach (i; l..r) {
19             sm = opTT(sm, d[i]);
20         }
21         return sm;
22     }
23     const(T) single(int k) { return d[k]; }
24     void singleSet(int k, in T x) { d[k] = x; }
25 }
26 
27 static struct Naive(T, L, alias opTT, alias opTL, alias opLL, T eT, L eL) {
28     import std.conv : to;
29     alias DataType = T;
30     alias LazyType = L;
31     alias BinSearch = binSearchNaiveLazy;
32     T[] d;
33     @property size_t length() const { return d.length; }
34     this(uint n) {
35         d = new T[n];
36     }
37     this(T[] first) {
38         d = first.dup;
39     }
40     const(T) sum(uint l, uint r) {
41         T sm = eT;
42         foreach (i; l..r) {
43             sm = opTT(sm, d[i]);
44         }
45         return sm;
46     }
47     void add(uint l, uint r, in L m) {
48         foreach (i; l..r) {
49             d[i] = opTL(d[i], m);
50         }
51     }
52     const(T) single(int k) { return d[k]; }
53     void singleSet(int k, in T x) { d[k] = x; }
54 }
55 
56 
57 int binSearchNaive(bool rev, alias pred, TR)(TR t, int a, int b) {
58     import std.traits : TemplateArgsOf;
59     alias args = TemplateArgsOf!TR;
60     alias opTT = args[1];
61     auto x = args[2];
62     with (t) {
63         static if (!rev) {
64             //left
65             if (pred(x)) return a-1;
66             foreach (i; a..b) {
67                 x = opTT(x, d[i]);
68                 if (pred(x)) return i;
69             }
70             return b;
71         } else {
72             if (pred(x)) return b;
73             foreach_reverse (i; a..b) {
74                 x = opTT(d[i], x);
75                 if (pred(x)) return i;
76             }
77             return a-1;
78         }
79     }
80 }
81 
82 int binSearchNaiveLazy(bool rev, alias pred, TR)(TR t, int a, int b) {
83     import std.traits : TemplateArgsOf;
84     alias args = TemplateArgsOf!TR;
85     alias opTT = args[2];
86     auto x = args[5];
87     with (t) {
88         static if (!rev) {
89             //left
90             if (pred(x)) return a-1;
91             foreach (i; a..b) {
92                 x = opTT(x, d[i]);
93                 if (pred(x)) return i;
94             }
95             return b;
96         } else {
97             if (pred(x)) return b;
98             foreach_reverse (i; a..b) {
99                 x = opTT(d[i], x);
100                 if (pred(x)) return i;
101             }
102             return a-1;
103         }
104     }
105 }