2011-09-07 17:26:31 webwalker 阅读数 818

       在分布式服务站点体系中,应用程序配置往往都是随程序发布包走,在线上运营的过程中,未有自动化部署工具的情况下,靠人力来部署上百台应用服务器,非同一般。即便通过自动化工具来完成配置更新与部署,多少还是要烦劳运维人员。于是乎,我们可以通过配置项的单点化来实现:通过在DB端完成数据配置,各应用系统共享配置项,数据、配置更新依赖缓存及时刷新即可。

       如有特殊需求,需要对单台服务器做配置区分,则可以通过增加APP配置的优先级来调整实现本地、DB端配置的顺序。       实现方式间接明了,下面给出示例:
1、Cache配置数据


        /// <summary>
        /// 获取配置表中数据并缓存
        /// </summary>
        /// <returns></returns>
        public static List<InitialParamEntity> GetList()
        {
            WebLog.WriteStart("Get Parameter List...");
            List<InitialParamEntity> list = null;
            try
            {
                string key = Consts.Keys.GET_PARA_INIT_INFO;

                if (HttpContext.Current == null || HttpContext.Current.Cache[key] == null)
                {
                    list = ParameterDA.GetList();
                    CacheHelper.Store(key, list);
                }

                list = CacheHelper.GetCache<List<InitialParamEntity>>(key);
            }
            catch (System.Exception ex)
            {
                WebLog.WriteStart("Get Parameter Exception:" + ex.GetObjectDetails("|"));
            }

            return list;
        }
    /// <summary>
    /// Summary description for InitialParamEntity
    /// </summary>
    public class InitialParamEntity
    {
        /// <summary>
        /// 参数类型
        /// </summary>
        public string ParaType
        {
            get;
            set;
        }

        /// <summary>
        /// 参数名
        /// </summary>
        public string ParaKey
        {
            get;
            set;
        }

        /// <summary>
        /// 参数值
        /// </summary>
        public string ParaValue
        {
            get;
            set;
        }
    }

2、缓存刷新(略)

在HttpHandler中配置缓存刷新Path,通过该Path以及对应的刷新参数,完成对应缓存或全缓存的刷新

3、配置项处理

建立配置类,继承IConfigurationSectionHandler, 在Global入口处调用Init方法完成数据初始化

public class MyConfig : IConfigurationSectionHandler
    {
        private MyConfig() { }

        #region read appsettings

        #region 不同参数类型
        
        #region 默认配置

        public static string GetConfig(string key)
        {
            string config = GetConfig<string>(key);
            if (String.IsNullOrEmpty(config))
            {
                return string.Empty;
            }
            return config;
        }

        public static T GetConfig<T>(string key)
        {
            return GetConfig<T>(key, default(T));
        }

        public static T GetConfig<T>(string key,T defaultValue)
        {
            if (Params == null || Params.Count == 0)
                return defaultValue;

            string parValue = Params.Get(key);

            if (!String.IsNullOrEmpty(parValue))
            {
                return (T)Convert.ChangeType(parValue, typeof(T));
            }

            return defaultValue;
        }

        #endregion

        #region Url 跳转

        /// <summary>
        /// 用户获取根据类型获得URL跳转地址
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="key"></param>
        /// <returns></returns>
        public static T GetMap<T>(string key)
        {
            if (MapPath == null || MapPath.Count == 0)
                return default(T);

            string parValue = MapPath.Get(key);

            if (!String.IsNullOrEmpty(parValue))
            {
                return (T)Convert.ChangeType(parValue, typeof(T));
            }

            return default(T);
        }

        public static string GetMap(string key)
        {
            return GetMap<string>(key);
        }

        #endregion

        #endregion

        public static string GetRadomConfig(string key, string defaultValue)
        {
            return GetRadomConfig<string>(key, defaultValue);
        }

        public static T GetRadomConfig<T>(string key, T defaultValue)
        {
            string result = GetConfig(key);
            string[] tempRet = result.Split(';');
            Random random = new Random();
            int index = random.Next(0, tempRet.Length);
            result = tempRet[index];
            return (T)Convert.ChangeType(result, typeof(T));
        }

        /// <summary>
        /// 随机取一个值
        /// </summary>
        /// <returns></returns>
        private static string GetRadomConfig(string value)
        {
            string[] serverList = value.Split(',');
            if (serverList.Length == 0) throw new ArgumentException("请求参数异常");

            int len = serverList.Length;
            if (len > 1)
            {
                Random rd = new Random((int)(DateTime.Now.Ticks));
                int rdNum = rd.Next(len);
                return serverList[rdNum];
            }
            return serverList[0];
        }
        #endregion

        #region Public attribute

        private static NameValueCollection _mapPath;
        public static NameValueCollection MapPath
        {
            get { return _mapPath; }
        }

        private static NameValueCollection _params;
        public static NameValueCollection Params
        {
            get { return _params; }
        }

        [Config(Key = "PayOrdersConnectionString", DefaultValue = "")]
        private static string payOrdersConnectionString;
        /// <summary>
        /// 新的订单库
        /// </summary>
        public static string PayOrdersConnectionString
        {
            get
            {
                return payOrdersConnectionString;
            }
        }

        #endregion

        #region internal
        static void SetField(Action<FieldInfo, ConfigAttribute> action)
        {
            Type type = typeof(MerchantConfig);
            FieldInfo[] fields = type.GetFields(BindingFlags.Static | BindingFlags.NonPublic);
            foreach (FieldInfo field in fields)
            {
                ConfigAttribute configAttr = (ConfigAttribute)Attribute.GetCustomAttribute(field, typeof(ConfigAttribute));
                if (configAttr != null)
                {
                    action(field, configAttr);
                }
            }
        }

        static void SetParamsValue(FieldInfo field, ConfigAttribute configAttr)
        {
            foreach (string s in Params.AllKeys)
            {
                if (string.Compare(s, configAttr.Key, true) == 0)
                {
                    field.SetValue(null, Convert.ChangeType(Params[configAttr.Key], configAttr.ValueType));
                }
            }
        }

        static void SetFieldDefault(FieldInfo field, ConfigAttribute configAttr)
        {
            field.SetValue(null, Convert.ChangeType(configAttr.DefaultValue, configAttr.ValueType));
        }

        internal static void UserDefinedCreate(NameValueCollection settings, NameValueCollection mapPath)
        {
            if (settings != null)
            {
                //Config配置,优先级高于数据库配置
                NameValueCollection rewriterSettings = (NameValueCollection)System.Configuration.ConfigurationManager.GetSection("MyParamSettings");

                if (rewriterSettings != null)
                {
                    foreach (string key in rewriterSettings.Keys)
                    {
                        //!string.IsNullOrEmpty(rewriterSettings[key]), 允许空字符
                        if (rewriterSettings[key] != null)
                        {
                            if (settings[key] != null)
                            {
                                WebLog.WriteStart("数据库:" + key + ":" + settings[key]);
                                WebLog.WriteStart("Config:" + key + ":" + rewriterSettings[key]);
                                settings[key] = rewriterSettings[key];
                            }
                            else if (mapPath[key] != null)
                            {
                                WebLog.WriteStart("数据库:" + key + ":" + mapPath[key]);
                                WebLog.WriteStart("Config:" + key + ":" + rewriterSettings[key]);
                                mapPath[key] = rewriterSettings[key];
                            }
                        }
                    }
                }

                _mapPath = mapPath;
                _params = settings;

                SetField(SetParamsValue);
            }
            else
            {
                SetField(SetFieldDefault);
            }
        }

        /// <summary>
        /// 获取数据库配置数据:初始化Config,生成静态XML配置文件
        /// </summary>
        public static void Init(List<InitialParamEntity> list)
        {
            NameValueCollection mapPath = new NameValueCollection();
            NameValueCollection setting = new NameValueCollection();

            foreach (InitialParamEntity param in list)
            {
                if (param.ParaType != null && param.ParaType.ToUpper() == "MAPPATH")
                {
                    mapPath.Add(param.ParaKey, param.ParaValue);
                }
                else
                {
                    setting.Add(param.ParaKey, param.ParaValue);
                }

                WebLog.WriteStart(param.ParaKey + ", " + param.ParaValue);
            }

            UserDefinedCreate(setting, mapPath);
        }

        #endregion

        #region IConfigurationSectionHandler 成员

        public object Create(object parent, object configContext, System.Xml.XmlNode section)
        {
            //调用自定义的初始化函数
            System.Diagnostics.Debug.WriteLine("config is modified------");
            NameValueCollection settings;

            try
            {
                System.Diagnostics.Debug.WriteLine("-------- Begin read configuration file");
                NameValueSectionHandler baseHandler = new NameValueSectionHandler();
                settings = (NameValueCollection)baseHandler.Create(parent, configContext, section);
            }
            catch
            {
                settings = null;
            }

            return settings;
        }

        #endregion
    }

    #region 默认值属性类
    [AttributeUsage(AttributeTargets.Field, AllowMultiple = false, Inherited = false)]
    internal class ConfigAttribute : Attribute
    {
        private object defaultValue;
        private string key;
        private Type valueType = typeof(string);

        public object DefaultValue
        {
            get { return defaultValue; }
            set { defaultValue = value; }
        }

        public string Key
        {
            get { return key; }
            set { key = value; }
        }

        public Type ValueType
        {
            get { return valueType; }
            set { valueType = value; }
        }
    }
    #endregion

4、提升单台机器配置优先级

<section name="MyParamSettings" type="System.Configuration.NameValueSectionHandler,System, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

  <MyParamSettings>
    <!-- 优先级高于数据库配置项 -->
    <add key="IFunctionService" value="http://www.baiduc.om" />
  </MyParamSettings>

5、配置项应用

        MyConfig.GetConfig("IFunctionService")
        MyConfig.GetConfig<string>("IFunctionService")
        MyConfig.GetConfig<int>("IFunctionService")




2014-09-10 20:24:55 jinlaigu 阅读数 831

我们都曾经单纯过,程序员其实都是很理性很善良的人,社会复杂,我们该如何成就我们自己人人生呢,我也有点迷茫,在这里说说我的一些经历和看法,希望CSDN各各位兄弟一起交流。茫茫人海,或者看到这篇文章就是一种缘分吧。

先发张图片,可能有些兄弟看过。

程序人生


有个笑话:少壮不努力,长大搞IT。说明IT不好搞啊。IT精英们,为什么你们的幸福指数这么低?

白菜我2005年大专毕业,一直从事IT行业,今年刚好9年,中间坎坎坷坷,历经风雨,痛苦很多,快乐也不少。

因为白菜我的同事(经常交往的)基本上都是以IT为主业,观察良久,发现一个问题:就是绝大多数的IT从业者,都是很年轻的人,这或许是我国的国情决定的吧:就现阶段来看,主力军是80后,后续主力军是90后的。就幸福指数来说,90后更快乐,80后逐渐开始痛苦了---------因为一般80后从事IT行业已经接近8年了。人生能有几个8年?8年里,从懵懂无知,到稍微开点眼界,知识,然后就是盲目乐观,等过了8年,就突然开始冷汗直流了:我以前为什么得过且过,没有危机感?现在没有成就感(虽然做了很多的工程,做了很多的项目,帮老板赚了很多钱,特别是蚊子132),只有危机感?

第一部分:岁月不待人

最近看到一个笑话:某大学打出巨大条幅:CS毁一生,网游穷三代;夜夜上自习,必成高富帅。初看,惹人笑,再看,令人心酸。多少的青年才俊就是毁在这些电子上面啊。游戏,最大的害人之处是:你在快乐的浪费时间,丝毫感觉不到浪费的危害。

以笔者为例,2005年大学毕业时,学的计算机网络技术,那时和努力,可是方向都不对,连个CCNA都没有听说过,只考了一个国家计算机技术三级,自认为很有成就感(主要是同学们都只考了个2级)。可是出来以后,发现大家都不认国内的计算机等级认证,最低都要CCNA,两年之后,市场只认CCNP了。

笔者今年32岁了,自学CCNP4年,居然还没有全过,真是难以见人。

我现在的一个室友,89年的,刚刚来成都上班。他有着一般年轻人的优点,也有一般人的缺点。他每天下班回来,吃过饭,打开电脑,看电影。我总是跟他说:年轻人啊,你的时间耽误不起啊。他呵呵一笑,说:我也知道,就是管不住自己啊。

多少年轻人啊,都是因为一句“管不住自己”,导致了多少可悲的后果!

在 我国古代,圣人早就说过:修身齐家治国平天下;第一要素,就是修身,所谓内圣外王,不过如此吧。修身,要从年轻的时候就开始。读过《蒋JIESHI日记》 的人,会很惊讶这么一件事:他居然连自己做的那些见不得人的事都会写上去,而且白天做了错事,晚上会很深刻的反省!要知道,他作为一个地区的最高级领导 人,他写日记的目的绝不是为了给别人看,他写日记是为了给自己看的,给自己反省立下证据的。他那时在外界已经没有人能监督他个人了,他自己还要监督自己? 为什么?因为欺骗自己不得啊,一个人或许能够上骗天,下骗地,中间骗空气,但是,他无论如何也骗不了自己!

有心理学家早就得出结论,一个人,如果在25岁以前都不能学会思考,那么他很可能这一辈子都不能学会正确的思考了。所以工厂里招学徒工都不要年纪大的,除了出于薪水的考虑以外,更多的是因为25岁以后心理年龄差不多就定型了,基本上不具有可塑性。一张白纸,你可以在上面画出美丽的画来,一张涂抹过半的纸呢?基本上不能再作画了。

流光容易把人抛,红了樱桃,绿了芭蕉;多少的IT少年啊,请珍惜时间,不要自我欺骗!尤其是众多的行业当中,尤以IT更新得最快,如果不想落伍,请实时更新自己的知识库。白发不随老人去,看看又上青年头,别辜负了少年头啊!

再讲一个很重要的方面,那就是看准方向。

基本上可以说,IT是一个很广泛的行业,大体上又可以分为四块:1,开发(以C#,J2EE为代表的),2,系统(不含开发,专门做维护的,以RHCE,MCITP为代表的),3,网络(不含系统和开发,以华为和思科做代表的),4,数据库(含数据库开发和维护,以DB2,ORACLE,MSSQL为代表的)。每一个领域都是博大精深的。每一个领域,只要你做好了,基本上都可以过上小康的生活,要是你浅尝辄止呢?那就只能顶多混个温饱吧。

IT职场大忌:什么都会一点,什么都不精。虽然很多的招聘广告上写着:精通J2EE,ORACLE,Linux,CCNP优先的。你一定见到过这种招聘广告,我只能很悲哀的告诉你,除非是天才和神仙,不然想要这样样样都精通的,基本上是不可能的。你看到这样的广告也不用怕,其实他们想找的或许就是一个J2EE程序员而已,其他的都是参考值。

所以,一个良心的建议就是,如果你想立志搞开发,那就死盯住开发不放,先通一门,再学其他的,绝对反对JAVA,C#齐头并进;如果你是搞网络的,不要妄想一边学习CCNP,一边学习MCITP,没用的,你去面试的时候,别人当然会看你的证书,但是,更重视你的能力。能力到了,证书可以没用,照用;能力不到,证书白考!我公司的原来的那个网管,进来的时候还是个CCNA,但是薪水高达20K,为什么?因为我公司需要一个能够保证7*24小时网络畅通的人,他能够!先前面试过好几个CCIE的人,居然连VRRP都没用做过,ASA防火墙都不曾配过,能顶事么?!

有一次,一个年轻人问法拉第:请问您能告诉我您成功的秘诀么?

法拉第问:你能让眼前的 阳光点燃一张纸么?年轻人说:不能!他就拿出一个放大镜来,放在阳光下,很快就点燃了一张纸!法拉第说:年轻人:把你的所有精力都集中到一点上去,你就能 成功啊!所以,搞开发的,你就一门头的先学好学精一门开发语言,然后再触类旁通的学点别的语言;搞网络管理的,你最好做个4年规划,4年CCNP,再四年拿个CCIE。做系统管理的也一样,万不可以今天玩玩windows,还没有弄懂AD是怎么回事呢,明天又听说搞LINUX的前途无量,就跑去搞LINUX玩,这样,最终恐怕会玩死自己。我有个很牛的同事,他以前在汤姆孙电子,汤姆逊电子集团里的所有DC服务器都是他部署的;后来来我公司4年,公司的系统管理也是井井有条;在我离开公司的前两个月,他被微软挖了过去,在深圳,做IT system管理的,能买房就很不错了,能进微软,那就少之又少了。他在进微软之前的两个月,自学了Redhat,随便就考过了RHCE,问他为什么那么轻松就过了,他说:天下大道相通啊----------windows和Redhat虽然完全是两个系统,但是,原理还是一样的,学到一定的程度,他们的技术都有很多相通呢。我忽然想起了武侠小说里的高手的境界:练到顶尖高手的境界,飞花摘叶,皆可伤人哪。我哥哥做VB10年,基本上没有摸过JAVA,居然在过年的时候抽空帮一个同学用JAVA写了个网站。

看准方向之后,就是撞到南山不回头的干劲。不信,你随便问问你身边的那些搞IT搞得好的人:你的IT之路一直是一帆风顺的么?都很轻轻松松的过来的么?保证十个中有九个啐你一脸吐沫:老子的IT之路,头两年就是在地狱里混过来的!我上大学欠一屁股债,大学毕业时工作看来都不好找,又借债一万二去了一个培训公司培训JAVA,培训6个月,出来的工资才2000不到!2000不到的工资还死扛了2年,才有了今天!当年培训的时候,老子一周才能吃上一次肉------肉包子里的肉!

今天先写到这吧。。。。


2008-11-22 22:59:00 qingtongqishi 阅读数 350
青铜骑士
22:17:49
就是在新增销售出库单时,可以返回从销售订单选择好几个那种,还可以根据销售订单号选一种
青铜骑士
22:19:39
这个你看要什么思路,我感觉插件写好后注册时不知道怎么注册,呵呵。。只能请教你了,听说过一段时间公司要派人去你们公司学习一下,有好多东西我们搞不定
彭小强
22:20:14
不太懂你的意思呀 
彭小强
22:20:31
就是在新增销售出库单时,可以返回从销售订单选择好几个那种,还可以根据销售订单号选一种 
彭小强
22:20:36
不是很清楚 
彭小强
22:21:20
你是说那个源单类型? 
青铜骑士
22:22:51
前几天那个是下推,现在是直接建销售出库,选择订单类型,可以按F7选销售订单
青铜骑士
22:23:17
这是两种建单的方式
青铜骑士
22:23:31
我想原理应该一样吧?
彭小强
22:23:53
哦 
彭小强
22:24:10
你是说选单,要带出环保类型? 
青铜骑士
22:26:55
也带环保类型和合同号码:从供应链的---销售出库--新增销售出库单这个界面上实现带销售订单的功能 ,避免手工输入
彭小强
22:27:50
这个你只要在选单事件里写就行了 
彭小强
22:28:30
有一个好像叫做afterselbill 
青铜骑士
22:28:38
可以在表头输入一个订单号码,也要可以返回销售订单里同时选择多个订单实现带过去信息
彭小强
22:28:38
具体不太记得了 
彭小强
22:30:04
对了 
彭小强
22:30:17
你可以在单据转换流程里面选择就行呀 
青铜骑士
22:30:27
也是从SEorder和SEorderEntry里根据源单号码抓数据吗
彭小强
22:30:40
如果两边的环保属性都在表体 
青铜骑士
22:32:06
我一直都是根据源单号码直接从SEorder里抓数据,这样会不会有问题
青铜骑士
22:32:59
那个转换流程我还不会用
彭小强
22:33:11
好像我教过你们的 
青铜骑士
22:33:32
呵呵。。。我当时没注意
彭小强
22:33:36
那个转换流程,比较简单 
青铜骑士
22:34:30
但这个是多个销售订单到一个销售出库单里,通过那个能实现吗
彭小强
22:34:48
只要都是表体,就可以 
青铜骑士
22:35:25
全是表体,呵呵。。。
彭小强
22:35:33
可以 
青铜骑士
22:36:16
插件如何注册呢,已经注册了一个21,0,那条插件了
彭小强
22:36:48
那你那FIndex再加1 
彭小强
22:36:58
最好,在以前的插件上写 
青铜骑士
22:37:19
哦,有点思路了
青铜骑士
22:38:00
写成一个插件,光事件不同就行吗
彭小强
22:38:10
嗯 
2016-02-04 11:09:43 u010885899 阅读数 1037

D. Tree and Queries
time limit per test
1 second
memory limit per test
256 megabytes
input
standard input
output
standard output

You have a rooted tree consisting of n vertices. Each vertex of the tree has some color. We will assume that the tree vertices are numbered by integers from 1 to n. Then we represent the color of vertex v as cv. The tree root is a vertex with number 1.

In this problem you need to answer to m queries. Each query is described by two integers vj, kj. The answer to queryvj, kj is the number of such colors of vertices x, that the subtree of vertex vj contains at least kj vertices of color x.

You can find the definition of a rooted tree by the following link:http://en.wikipedia.org/wiki/Tree_(graph_theory).

Input

The first line contains two integers n and m (2 ≤ n ≤ 105; 1 ≤ m ≤ 105). The next line contains a sequence of integers c1, c2, ..., cn (1 ≤ ci ≤ 105). The next n - 1 lines contain the edges of the tree. The i-th line contains the numbers ai, bi (1 ≤ ai, bi ≤ nai ≠ bi) — the vertices connected by an edge of the tree.

Next m lines contain the queries. The j-th line contains two integers vj, kj (1 ≤ vj ≤ n; 1 ≤ kj ≤ 105).

Output

Print m integers — the answers to the queries in the order the queries appear in the input.

Sample test(s)
input
8 5
1 2 2 3 3 2 3 3
1 2
1 5
2 3
2 4
5 6
5 7
5 8
1 2
1 3
1 4
2 3
5 3
output
2
2
1
0
1
input
4 1
1 2 3 4
1 2
2 3
3 4
1 1
output
4
Note

A subtree of vertex v in a rooted tree with root r is a set of vertices {u : dist(r, v) + dist(v, u) = dist(r, u)}. Wheredist(x, y) is the length (in edges) of the shortest path between vertices x and y.


题目是给出了一个树,树上的每一个节点都有一个颜色。然后给出了m个查询(v,k),每次查询以这个点v的子树里面,颜色数量至少为k的有多少种颜色。

深搜一遍,将每一个节点的子树查询转换为包含的区间查询,记录各个颜色的数量,然后因为查询的k至少是1,所以用一个数组统计至少为k的数量。

代码:

#pragma comment(linker, "/STACK:102400000,102400000")
#pragma warning(disable:4996)  
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <string>
#include <cstdio>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define INF 0x3fffffff
typedef long long ll;

const int mod = 1e9 + 7;
const int maxn = 1e5 + 5;

int n, m, num, bk;
vector<int>edg[maxn];
int cor[maxn], color[maxn], cor_num[maxn], L[maxn], R[maxn], cnt[maxn], res[maxn];

struct no
{
	int le;
	int ri;
	int id;
	int k;
}qu[maxn];

void input()
{
	int i, u, v;
	scanf("%d%d", &n, &m);

	for (i = 1; i <= n; i++)
	{
		scanf("%d", &cor[i]);
	}
	for (i = 1; i <= n - 1; i++)
	{
		scanf("%d%d", &u, &v);
		edg[u].push_back(v);
		edg[v].push_back(u);
	}
}

void dfs(int x, int google)
{
	color[++num] = cor[x];
	L[x] = num;

	int i;
	int sz = edg[x].size();

	for (i = 0; i < sz; i++)
	{
		if (edg[x][i] != google)
		{
			dfs(edg[x][i], x);
		}
	}
	R[x] = num;
}

bool cmp(no a, no b)
{
	if (a.le / bk == b.le / bk)
	{
		return a.ri < b.ri;
	}
	else
	{
		return a.le / bk < b.le / bk;
	}
}

void solve()
{
	num = 0;
	dfs(1, -1);

	int i, j, c, k;
	bk = sqrt(1.0*n);
	for (i = 1; i <= m; i++)
	{
		scanf("%d%d", &c, &k);
		qu[i].id = i;
		qu[i].k = k;
		qu[i].le = L[c];
		qu[i].ri = R[c];
	}
	sort(qu + 1, qu + m + 1, cmp);

	int pl = 1, pr = 0;
	int id;
	for (i = 1; i <= m; i++)
	{
		id = qu[i].id;
		if (qu[i].le == qu[i].ri)
		{
			res[id] = qu[i].k > 1 ? 0 : 1;
			continue;
		}
		if (pr < qu[i].ri)
		{
			for (j = pr + 1; j <= qu[i].ri; j++)
			{
				cor_num[++cnt[color[j]]]++;
			}
		}
		else
		{
			for (j = pr; j > qu[i].ri; j--)
			{
				cor_num[cnt[color[j]]--]--;
			}
		}
		pr = qu[i].ri;

		if (pl < qu[i].le)
		{
			for (j = pl; j < qu[i].le; j++)
			{
				cor_num[cnt[color[j]]--]--;
			}
		}
		else
		{
			for (j = pl - 1; j >= qu[i].le; j--)
			{
				cor_num[++cnt[color[j]]]++;
			}
		}
		pl = qu[i].le;
		res[id] = cor_num[qu[i].k];
	}
	for (i = 1; i <= m; i++)
	{
		printf("%d\n", res[i]);
	}
}

int main() 
{
	//freopen("i.txt","r",stdin);
	//freopen("o.txt","w",stdout);
	
	input();
	solve();

	return 0;
}

2014-07-25 18:16:43 u013568834 阅读数 306
麦莎来了
卷起洪涛的思潮
随缘普陀的佛音
在海的那边萦萦绕绕
四百个日日夜夜
点化了江左的顽石
千年的修练
染就莲花的洁瑕
心中的虔诚
容不得半星的泥沙
平和的心态
透视着生活的执著
美好的追求
梦昧着来生的羽化
飘然的心扉
是成熟与热情的交织
坦荡的性格
是奔放与大器的晚成
在佛的台沿
萌发着相好的心爱
在莲的菩提
滋生着敬慕的目光
同在蓝天下
眷恋着梦网的恩赐
同在屋檐下
呢喃红蓝温馨的幻想
同在三月里
放纵双蝶的冉冉
同在苍穹里
燃发日月的精华

最好的时光在路上

阅读数 211

副业

阅读数 155

没有更多推荐了,返回首页