1087 - Diablo
Time Limit: 2 second(s) Memory Limit: 64 MB

All of you must have played the game 'Diablo'. It's an exclusive game to play. In this game the main opponent of you is Diablo. If you kill him the game finishes. But as usual, Diablo is smarter than you.

Diablo has a large number of army. Diablo arranges them in a line in any arbitrary order and everyone is given an integer id. Each time Diablo either adds one army in the end or he calls for the kth army (from left) from the line. Then the army gets out and it attacks you.

Since you are a great magician, you can read Diablo's mind. Now you want to find the id of the armies who are about to attack you.

Input

Input starts with an integer T (≤ 5), denoting the number of test cases.

The first line of each case is a blank line. The next line contains two integers n (0 ≤ n ≤ 105), denoting the number of the initial army and q (1 ≤ q ≤ 50000) representing the number of queries. The next line contains n space separated integers. The ith integer of this line denotes the id of the ith person. Each of these integers will be positive and fits into a 32 bit signed integer. Each of the next q lines will contain a query, of the form:

a p    (add a person at the end of the line whose id is p)

c k    (call the kth person from the line (from left), k is a positive 32 bit signed integer)

Output

For each case of input, print the case number in a line. Then for all the queries 'c k' you have to print the id of the kth person or 'none' if there is none.

Sample Input

Output for Sample Input

2

5 5

6 5 3 2 1

c 1

c 1

a 20

c 4

c 4

2 1

18811 1991

c 1

Case 1:

6

5

20

none

Case 2:

18811

Notes

Dataset is huge, use faster i/o methods.


PROBLEM SETTER: JANE ALAM JAN
思路:线段数求第k大树,单点更新;
  1 #include<stdio.h>
2 #include<algorithm>
3 #include<iostream>
4 #include<string.h>
5 #include<queue>
6 #include<stack>
7 #include<map>
8 #include<math.h>
9 using namespace std;
10 typedef long long LL;
11 int tree[5000000];
12 int ans[160005];
13 int id[160000];
14 int flag[160000];
15 void build(int l,int r,int k,int u);
16 int ask(int l,int r,int k,int m);
17 void up(int k);
18 void in(int x);
19 int main(void)
20 {
21 int i,j,k;
22 scanf("%d",&k);
23 int s;
24 int n,m;
25 int gg=0;
26 for(s=1; s<=k; s++)
27 {
28 scanf("%d %d",&n,&m);
29 for(i=1; i<=n; i++)
30 {
31 scanf("%d",&ans[i]);
32 }
33 memset(flag,0,sizeof(flag));
34 for(i=n+1; i<=160000; i++)
35 {
36 flag[i]=1;
37 }
38 build(1,160000,0,n);
39 gg=n;
40 int cn=n;
41 printf("Case %d:\n",s);
42 while(m--)
43 {
44 char a[2];
45 int x;
46 scanf("%s %d",a,&x);
47 if(a[0]=='c')
48 {
49 if(gg<x)
50 printf("none\n");
51 else
52 {
53 int cc=ask(1,160000,0,x);
54 printf("%d\n",ans[cc]);
55 gg--;
56 }
57 }
58 else
59 {
60 cn++;
61 flag[cn]=0;
62 ans[cn]=x;
63 gg++;
64 in(cn);
65 }
66 }
67 }
68 return 0;
69 }
70 void build(int l,int r,int k,int u)
71 {
72 if(l==r)
73 {
74 if(r<=u)
75 {
76 id[l]=k;
77 tree[k]=1;
78 }
79 else
80 {
81 id[l]=k;
82 tree[k]=0;
83 }
84 return ;
85 }
86 else
87 {
88 build(l,(l+r)/2,2*k+1,u);
89 build((l+r)/2+1,r,2*k+2,u);
90 tree[k]=tree[2*k+1]+tree[2*k+2];
91 }
92 }
93 int ask(int l,int r,int k,int ans)
94 {
95 if(ans==tree[k])
96 {
97 int c=id[r];
98 if(flag[r]==0)
99 { flag[r]=1;
100 up(c);
101 return r;
102 }
103 else
104 {
105 if(tree[2*k+1]<ans)
106 {
107 return ask((l+r)/2+1,r,2*k+2,ans-tree[2*k+1]);
108 }
109 else if(tree[2*k+1]==ans)
110 {
111 return ask(l,(l+r)/2,2*k+1,ans);
112 }
113 }
114 }
115 else if(ans<tree[k])
116 {
117 if(tree[2*k+1]>=ans)
118 {
119 return ask(l,(l+r)/2,2*k+1,ans);
120 }
121 else if(tree[2*k+1]<ans)
122 {
123 return ask((l+r)/2+1,r,2*k+2,ans-tree[2*k+1]);
124 }
125 }
126 }
127 void up(int k)
128 {
129 tree[k]=0;
130 if(k==0)return ;
131 k=(k-1)/2;
132 while(k>=0)
133 {
134 tree[k]=tree[2*k+1]+tree[2*k+2];
135 if(k==0)
136 return ;
137 k=(k-1)/2;
138 }
139 }
140 void in(int x)
141 {
142 int cc=id[x];
143 tree[cc]=1;
144 if(cc==0)return ;
145 cc=(cc-1)/2;
146 while(cc>=0)
147 {
148 tree[cc]=tree[2*cc+1]+tree[2*cc+2];
149 if(cc==0)
150 return ;
151 cc=(cc-1)/2;
152 }
153 }

1087 - Diablo的更多相关文章

  1. lightoj刷题日记

    提高自己的实力, 也为了证明, 开始板刷lightoj,每天题量>=1: 题目的类型会在这边说明,具体见分页博客: SUM=54; 1000 Greetings from LightOJ [简单 ...

  2. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  3. 【BZOJ 1087】【SCOI 2005】互不侵犯King

    http://www.lydsy.com/JudgeOnline/problem.php?id=1087 很简单的状压,需要预处理,我两个状态可不可以挨着的预处理出错WA了好几次. 这个位运算预处理好 ...

  4. 轮廓线DP POJ3254 && BZOJ 1087

    补了一发轮廓线DP,发现完全没有必要从右往左设置状态,自然一点: 5 6 7 8 9 1 2 3 4 如此设置轮廓线标号,转移的时候直接把当前j位改成0或者1就行了.注意多记录些信息对简化代码是很有帮 ...

  5. dp 动态规划 hdu 1003 1087

    动态规划就是寻找最优解的过程 最重要的是找到关系式 hdu 1003 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1003 题目大意:求最大字序列和, ...

  6. BZOJ 1087 题解【状压DP】

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3112  Solved: 1816[Submit][ ...

  7. HDU 1087 简单dp,求递增子序列使和最大

    Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 ...

  8. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  9. hdu 1087 动态规划之最长上升子序列

    http://acm.hdu.edu.cn/showproblem.php?pid=1087 Online Judge Online Exercise Online Teaching Online C ...

随机推荐

  1. 进程和线程操作系统转载的Mark一下

    https://www.cnblogs.com/leisure_chn/p/10393707.html Linux的进程线程及调度 本文为宋宝华<Linux的进程.线程以及调度>学习笔记. ...

  2. 如何在 ASP.NET Core 中构建轻量级服务

    在 ASP.NET Core 中处理 Web 应用程序时,我们可能经常希望构建轻量级服务,也就是没有模板或控制器类的服务. 轻量级服务可以降低资源消耗,而且能够提高性能.我们可以在 Startup 或 ...

  3. day35前端基础之BOM和DOM

    day35前端基础之BOM和DOM BOM操作 简介 BOM(Browser Object Model)是指浏览器对象模型,它使 JavaScript 有能力与浏览器进行"对话". ...

  4. Celery进阶

    Celery进阶 在你的应用中使用Celery 我们的项目 proj/__init__.py   /celery.py   /tasks.py 1 # celery.py 2 from celery ...

  5. Java实现读取文件

    目录 Java实现读取文件 1.按字节读取文件内容 使用场景 2.按字符读取文件内容 使用场景 3.按行读取文件内容 使用场景 4.随机读取文件内容 使用场景 Java实现读取文件 1.按字节读取文件 ...

  6. 零基础学习java------37---------mybatis的高级映射(单表查询,多表(一对一,一对多)),逆向工程,Spring(IOC,DI,创建对象,AOP)

    一.  mybatis的高级映射 1  单表,字段不一致 resultType输出映射: 要求查询的字段名(数据库中表格的字段)和对应的java类型的属性名一致,数据可以完成封装映射 如果字段和jav ...

  7. 零基础学习java------25--------jdbc

    jdbc开发步骤图 以下要用到的products表 一. JDBC简介 补充    JDBC本质:其实是官方(sun公司)定义的一套操作所有关系型数据库的规则,即接口,各个数据库厂商趋势线这个接口,提 ...

  8. Oracle—merge into语法

    oracle的merge into语法,在这种情况下: 基于某些字段,存在就更新,不存在就插入: 不需要先去判断一下记录是否存在,直接使用merge into merge into 语法: MERGE ...

  9. android转换透明度

    比方说 70% 白色透明度. 就用255*0.7=185.5  在把185.5转换成16进制就是B2 你只需要写#B2FFFFFF 如果是黑色就换成6个0就可以了.前2位是控制透明度的.

  10. jenkins之授权和权限管理

    #:创建角色,给角色授权,然后创建用户,将用户加入到角色(前提先安装插件) #:先将之前的卸载掉 #:然后重启服务,在可选插件搜索Role #:装完重启服务 root@ubuntu:~# system ...