题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3765

Lights


Time Limit: 8 Seconds      Memory Limit: 131072 KB

Now you have N lights in a line. Don't worry - the lights don't have color. The only status they have is on and off. And, each light has a value, too.

There is a boring student in ZJU. He decides to do some boring operations to the lights:

  1. L R status - Query the GCD (Greatest Common Divisor) of the value of the given status lights in range [LR]. For example, if now we have 3 lights which are {on, off and on}, and their value are {3, 5, 9}, then the GCD of the number of the lights on in [1, 3] is 3, and the lights off is 5.
  2. i value status - Add a light just behind to ith light. The initial status and the value is given also.
  3. i - Remove the ith light.
  4. i - If ith light is on, turn it off, else turn it on.
  5. i x - Modify the value of ith light to x.

Please help this boring guy to do this boring thing so that he can have time to find a girlfriend!

Input

The input contains multiple test cases. Notice there's no empty line between each test case.

For each test case, the first line of the a case contains two integers, N (1 ≤ N ≤ 200000) and Q (1 ≤ Q ≤ 100000), indicating the number of the lights at first and the number of the operations. In following N lines, each line contains two integers, Numi (1 ≤ Numi ≤ 1000000000) and Statusi (0 ≤ Statusi ≤ 1), indicating the number of the light i and the status of it. In following Q lines, each line indicating an operation, and the format is described above.

It is guaranteed that the range of the operations will be appropriate. For example, if there is only 10 lights, you will not receive an operation like "Q 1 11 0" or "D 11".

Output

For each Query operation, output an integer, which is the answer to the query. If no lights are with such status, please output -1.

Sample Input

3 12
27 1
32 0
9 1
Q 1 3 1
I 3 64 0
Q 2 4 0
Q 2 4 1
I 2 43 1
D 5
Q 1 2 1
M 1 35
Q 1 2 1
R 1
R 3
Q 1 2 1

Sample Output

9
32
9
27
35
-1

很裸的题目了,用splay维护也很简单,练练手而已。

 /* ***********************************************
Author :kuangbin
Created Time :2014/3/2 20:02:38
File Name :E:\2014ACM\比赛\ZOJ_March2014\I.cpp
************************************************ */ #include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define Key_value ch[ch[root][1]][0]
const int MAXN = ;
int pre[MAXN],ch[MAXN][],key[MAXN],size[MAXN];
int root,tot1;
int sum0[MAXN],sum1[MAXN];//该子树对应状态的gcd
int st[MAXN]; //该节点的状态
int s[MAXN],tot2;//内存池和容量
//初始节点的值和状态
int a[MAXN];
int status[MAXN];
int n,q; long long gcd(long long a,long long b)
{
if(b == )return a;
else return gcd(b,a%b);
}
void NewNode(int &r,int father,int k,int _st)
{
if(tot2) r = s[tot2--];
else r = ++tot1;
pre[r] = father;
ch[r][] = ch[r][] = ;
key[r] = k;
st[r] = _st;
if(_st == ){sum0[r] = k; sum1[r] = ;}
else {sum1[r] = k; sum0[r] = ;}
size[r] = ;
}
void push_up(int r)
{
int lson = ch[r][], rson = ch[r][];
size[r] = size[lson] + size[rson] + ;
sum0[r] = sum1[r] = ;
sum0[r] = gcd(sum0[lson],sum0[rson]);
sum1[r] = gcd(sum1[lson],sum1[rson]);
if(st[r])sum1[r] = gcd(sum1[r],key[r]);
else sum0[r] = gcd(sum0[r],key[r]);
}
void push_down(int r)
{ }
void Build(int &x,int l,int r,int father)
{
if(l > r)return;
int mid = (l + r)/;
NewNode(x,father,a[mid],status[mid]);
Build(ch[x][],l,mid-,x);
Build(ch[x][],mid+,r,x);
push_up(x);
}
void Init()
{
root = tot1 = tot2 = ;
ch[root][] = ch[root][] = size[root] = pre[root] = ;
sum0[root] = sum1[root] = ;
NewNode(root,,,);
NewNode(ch[root][],root,,);
for(int i = ;i < n;i++)
scanf("%d%d",&a[i],&status[i]);
Build(Key_value,,n-,ch[root][]);
push_up(ch[root][]);
push_up(root);
}
void Rotate(int x,int kind)
{
int y = pre[x];
push_down(y);
push_down(x);
ch[y][!kind] = ch[x][kind];
pre[ch[x][kind]] = y;
if(pre[y])
ch[pre[y]][ch[pre[y]][]==y] = x;
pre[x] = pre[y];
ch[x][kind] = y;
pre[y] = x;
push_up(y);
}
void Splay(int r,int goal)
{
push_down(r);
while(pre[r] != goal)
{
if(pre[pre[r]] == goal)
{
Rotate(r,ch[pre[r]][] == r);
}
else
{
int y = pre[r];
int kind = ch[pre[y]][] == y;
if(ch[y][kind] == r)
{
Rotate(r,!kind);
Rotate(r,kind);
}
else
{
Rotate(y,kind);
Rotate(r,kind);
}
}
}
push_up(r);
if(goal == )root = r;
}
int Get_kth(int r,int k)
{
push_down(r);
int t = size[ch[r][]] + ;
if(t == k)return r;
if(t > k)return Get_kth(ch[r][],k);
else return Get_kth(ch[r][],k-t);
}
//在第pos个数后面插入一个数
void Insert(int pos,int _val,int _st)
{
Splay(Get_kth(root,pos+),);
Splay(Get_kth(root,pos+),root);
NewNode(Key_value,ch[root][],_val,_st);
push_up(ch[root][]);
push_up(root);
}
void erase(int r)
{
if(!r)return;
s[++tot2] = r;
erase(ch[r][]);
erase(ch[r][]);
}
//删除第pos个数
void Delete(int pos)
{
Splay(Get_kth(root,pos),);
Splay(Get_kth(root,pos+),root);
erase(Key_value);
pre[Key_value] = ;
Key_value = ;
push_up(ch[root][]);
push_up(root);
}
//改变第pos个数的状态
void Change(int pos)
{
Splay(Get_kth(root,pos),);
Splay(Get_kth(root,pos+),root);
st[Key_value] ^= ;
push_up(Key_value);
push_up(ch[root][]);
push_up(root);
}
//改变第pos个数的值
void Modify(int pos,int _val)
{
Splay(Get_kth(root,pos),);
Splay(Get_kth(root,pos+),root);
key[Key_value] = _val;
push_up(Key_value);
push_up(ch[root][]);
push_up(root); }
int Query(int L,int R,int _st)
{
int ans ;
Splay(Get_kth(root,L),);
Splay(Get_kth(root,R+),root);
if(_st == )ans = sum0[Key_value];
else ans = sum1[Key_value];
if(ans == )ans = -;
return ans;
} int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(scanf("%d%d",&n,&q) == )
{
Init();
char op[];
while(q--)
{
scanf("%s",op);
if(op[] == 'Q')
{
int L,R,_st;
scanf("%d%d%d",&L,&R,&_st);
printf("%d\n",Query(L,R,_st));
}
else if(op[] == 'I')
{
int pos,val,_st;
scanf("%d%d%d",&pos,&val,&_st);
Insert(pos,val,_st);
}
else if(op[] == 'D')
{
int pos;
scanf("%d",&pos);
Delete(pos);
}
else if(op[] == 'R')
{
int pos;
scanf("%d",&pos);
Change(pos);
}
else if(op[] == 'M')
{
int pos,val;
scanf("%d%d",&pos,&val);
Modify(pos,val);
}
}
}
return ;
}

最新文章

  1. SQL基础(3)-索引/触发器/视图操作
  2. Mac 使用Sublime Text 3 搭建C开发环境
  3. linux tcp超时重传实现分析
  4. 《Selenium2自动化测试实战--基于Python语言》 --即将面市
  5. apiCloud创建APP项目
  6. [原创,分享]DbHelper 续
  7. OpenGL2-绘制三角形
  8. Google+ 技巧四则
  9. WUI-&gt;ACE权限
  10. Chris Richardson微服务翻译:构建微服务之微服务架构的进程通讯
  11. Java秋招面经大合集
  12. Django:安装和启动
  13. 红黑树深入剖析及Java实现
  14. phpcmsv9 管理加密解密
  15. GIL(全局解释器锁)与互斥锁
  16. Android AOP之路三 Android上的注解
  17. 磁盘映射: between 宿主机 and 客户机
  18. 数据库状态标识位flag设计
  19. 使用postman做接口测试(二)
  20. 〖wordpress实用小技巧〗添加几个字符实现子目录访问转移到域名直接访问

热门文章

  1. iOS中UITableView和UICollectionView的默认空态页
  2. shell test条件判断
  3. &lt;header&gt;&lt;footer&gt;引用
  4. Spark笔记之累加器(Accumulator)
  5. 02 uni-app框架学习:设置全局样式统一每个页面的背景颜色
  6. Python 入门基础2 --基本数据类型、运算符
  7. c#调用c++ dll 入坑记录
  8. kibana提示&quot;[illegal_argument_exception] mapper [hits] cannot be changed from type [long] to [integer]&quot;
  9. poj2049
  10. 局域网搭建https局域网