예제 #1
0
    static void Main()
    {
        var N = int.Parse(Console.ReadLine());
        var L = new List <Point>();

        for (int i = 0; i < N; ++i)
        {
            var buf = Console.ReadLine().Split(new char[] { ' ' });
            var p   = new Point();
            p.w = int.Parse(buf[0]);
            p.h = int.Parse(buf[1]);
            L.Add(p);
        }

        L.Sort(delegate(Point p1, Point p2){
            if (p1.h != p2.h)
            {
                return(p1.h - p2.h);
            }
            return(-(p1.w - p2.w));
        });

        var st = new SegTree <int>(100001, Math.Max);

        foreach (var p in L)
        {
            st.Update(p.w, st.Query(0, p.w) + 1);
        }

        Console.WriteLine(st.Query(0, st.Count));
    }
예제 #2
0
    static void Main()
    {
        var N = int.Parse(Console.ReadLine());
        var S = new SegTree <int>(N, Math.Max);

        for (int i = 0; i < N; ++i)
        {
            var c = int.Parse(Console.ReadLine()) - 1;
            S.Update(c, S.Query(0, c + 1) + 1);
        }

        Console.WriteLine(N - S.Query(0, N));
    }
예제 #3
0
    static void Main()
    {
        var NQ = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
        int N = NQ[0], Q = NQ[1];

        var st = new SegTree <long>(N, delegate(long x, long y) { return(x ^ y); });

        var A = Console.ReadLine().Split(' ').Select(long.Parse).ToArray();

        for (int i = 0; i < N; ++i)
        {
            st.Update(i, A[i]);
        }

        for (int i = 0; i < Q; ++i)
        {
            var  TXY = Console.ReadLine().Split(' ').Select(long.Parse).ToArray();
            long T = TXY[0], X = TXY[1], Y = TXY[2];

            if (T == 1)
            {
                A[X - 1] ^= Y;
                st.Update((int)X - 1, A[X - 1]);
            }
            else
            {
                Console.WriteLine(st.Query((int)X - 1, (int)Y));
            }
        }
    }
예제 #4
0
    static void Main()
    {
        var str = Console.ReadLine().Split(' ');
        int N = int.Parse(str[0]), K = int.Parse(str[1]);

        int Amax = 300000;
        var st   = new SegTree <int>(Amax + 1, Math.Max);

        for (long i = 0; i < N; ++i)
        {
            var A = int.Parse(Console.ReadLine());
            st.Update(A, st.Query(Math.Max(0, A - K), Math.Min(Amax, A + K) + 1) + 1);
        }

        Console.WriteLine(st.Query(0, Amax + 1));
    }
예제 #5
0
    static void Main()
    {
        //var st = new SegTree<int>(14, Math.Max);
        var st = new SegTree <int>(14, delegate(int x, int y) { return(x + y); });

        st.Print();

        st.Update(5, 3);
        st.Print();
        st.Update(8, 4);
        st.Print();
        st.Update(10, 2);
        st.Print();

        Console.WriteLine(st.Query(3, 7));
    }
예제 #6
0
    public static void Main()
    {
        var nq = Console.ReadLine().Split().Select(int.Parse).ToArray();
        var a  = Console.ReadLine().Split().Select(int.Parse).ToArray();
        SegTree <Tuple <int, int> > rmq = new SegTree <Tuple <int, int> >(a.Select((x, y) => new Tuple <int, int>(x, y + 1)).ToArray(), new Tuple <int, int>(int.MaxValue, -1), (x, y) => x.Item1 < y.Item1 ? x : y);

        for (int i = 0; i < nq[1]; i++)
        {
            var query = Console.ReadLine().Split().Select(int.Parse).ToArray();
            if (query[0] == 1)
            {
                var tmp = rmq[query[1] - 1].Item1;
                rmq[query[1] - 1] = new Tuple <int, int>(rmq[query[2] - 1].Item1, query[1]);
                rmq[query[2] - 1] = new Tuple <int, int>(tmp, query[2]);
            }
            else
            {
                Console.WriteLine(rmq.Query(query[1] - 1, query[2] - 1).Item2);
            }
        }
    }
예제 #7
0
    static void Main()
    {
        var N = long.Parse(Console.ReadLine());
        var A = Console.ReadLine().Split(' ').Select(long.Parse).ToList();

        var E = new List <long> [N];

        for (int i = 0; i < N; ++i)
        {
            E[i] = new List <long>();
        }

        for (int i = 0; i < N - 1; ++i)
        {
            var uv = Console.ReadLine().Split(' ').Select(int.Parse).ToList();
            int u = uv[0], v = uv[1];
            E[u - 1].Add(v - 1);
            E[v - 1].Add(u - 1);
        }



        //var st = new SegTree<int>(14, Math.Max);
        var st = new SegTree <int>(14, delegate(int x, int y) { return(x + y); });

        st.Print();

        st.Update(5, 3);
        st.Print();
        st.Update(8, 4);
        st.Print();
        st.Update(10, 2);
        st.Print();

        Console.WriteLine(st.Query(3, 7));
    }
예제 #8
0
    static void Main()
    {
        var HWN = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
        int H = HWN[0], W = HWN[1], N = HWN[2];

        var Ymin = new int[W];

        for (int w = 0; w < W; ++w)
        {
            Ymin[w] = H;
        }

        var Xmin = new int[H];

        for (int h = 0; h < H; ++h)
        {
            Xmin[h] = W;
        }

        var XYList = new List <XYPoint>();

        for (int i = 0; i < N; ++i)
        {
            var YX = Console.ReadLine().Split(' ').Select(int.Parse).ToArray();
            int Y = YX[0] - 1, X = YX[1] - 1;

            XYList.Add(new XYPoint(X, Y));

            Ymin[X] = Math.Min(Ymin[X], Y);
            Xmin[Y] = Math.Min(Xmin[Y], X);
        }

        XYList.Sort(delegate(XYPoint p1, XYPoint p2) { return(p1.Y - p2.Y); });

        int xEnd = Xmin[0];
        int yEnd = Ymin[0];

        long ans = 0;

        for (int x = 0; x < xEnd; ++x)
        {
            ans += Ymin[x];
        }

        var st = new SegTree <int>(W + 2, delegate(int x, int y) { return(x + y); });

        for (int x = xEnd; x < W; ++x)
        {
            st.Update(x, 1);
        }

        int n = 0;

        for (int y = 0; y < yEnd; ++y)
        {
            while (n < N && XYList[n].Y <= y)
            {
                var p = XYList[n];
                st.Update(p.X, 1);
                n += 1;
            }

            int add = st.Query(0, Xmin[y]);
            ans += add;
        }

        Console.WriteLine(ans);
    }
예제 #9
0
    static void Main()
    {
        var str = Console.ReadLine().Split(" ");
        var N   = int.Parse(str[0]);
        var Q   = int.Parse(str[1]);

        var C = new int[N];

        str = Console.ReadLine().Split(" ");
        for (int i = 0; i < N; ++i)
        {
            C[i] = int.Parse(str[i]);
        }

        var LR = new List <List <int> >();

        for (int q = 0; q < Q; ++q)
        {
            str = Console.ReadLine().Split(" ");
            int l = int.Parse(str[0]);
            int r = int.Parse(str[1]);

            LR.Add(new List <int> {
                q, l, r
            });
        }

        LR.Sort((x, y) => x[2] - y[2]);

        var I = new int[N + 1];

        for (int i = 0; i < I.Length; ++i)
        {
            I[i] = -1;
        }

        var st = new SegTree <int>(N, (x, y) => x + y, 0);

        var ans = new int[Q];
        int j   = 0;

        for (int iq = 0; iq < Q; ++iq)
        {
            int q = LR[iq][0];
            int l = LR[iq][1];
            int r = LR[iq][2];

            for (; j < r; ++j)
            {
                int c = C[j];

                int iprev = I[c];
                I[c] = j;

                if (iprev != -1)
                {
                    st.Update(iprev, 0);
                }
                st.Update(j, 1);
            }
            ans[q] = st.Query(l - 1, r);
        }

        Console.WriteLine(String.Join("\n", ans));
    }
예제 #10
0
    static void Main()
    {
        //->  //var st = new SegTree<int>(14, Math.Max);
        //->  var st = new SegTree<int>(14, delegate(int x, int y) {return x+y;});
        //->  st.Print();
        //->
        //->  st.Update(5, 3);
        //->  st.Print();
        //->  st.Update(8, 4);
        //->  st.Print();
        //->  st.Update(10, 2);
        //->  st.Print();
        //->
        //->  Console.WriteLine(st.Query(3, 7));

        var NQ = Console.ReadLine().Split().Select(int.Parse).ToList();
        int N = NQ[0], Q = NQ[1];
        int M = 200000;

        var st = new SegTree <int>(M, Math.Min);

        var Y = new Yochien[M];

        for (int i = 0; i < M; ++i)
        {
            Y[i] = new Yochien();
        }

        var LY = new int[N]; // i-th infant belongs to LY[i]-th Yochien.
        var LI = new int[N]; // i-th infant belongs to LI-th index (of LY[i]-th Yochien).

        for (int i = 0; i < N; ++i)
        {
            var AB = Console.ReadLine().Split().Select(int.Parse).ToList();
            int A = AB[0], B = AB[1];

            LY[i] = B - 1;
            LI[i] = Y[LY[i]].Add(A);

            //Console.WriteLine($"{LY[i]}, {LI[i]}");
        }

        for (int i = 0; i < M; ++i)
        {
            st.Update(i, Y[i].Max());
        }

        for (int iq = 0; iq < Q; ++iq)
        {
            var CD = Console.ReadLine().Split().Select(int.Parse).ToList();
            int C = CD[0], D = CD[1];

            var ly_old = LY[C - 1];
            var y_old  = Y[ly_old];
            int A      = y_old.Update(LI[C - 1], 0);

            var ly_new = LY[C - 1] = D - 1;
            var y_new  = Y[ly_new];
            LI[C - 1] = y_new.Add(A);

            st.Update(ly_old, y_old.Max());
            st.Update(ly_new, y_new.Max());
            Console.WriteLine(st.Query(0, st.Count));
        }
    }