We often have to copy large volumes of information. Such operation can take up many computer resources. Therefore, in this problem you are advised to come up with a way to copy some part of a number array into another one, quickly.

More formally, you've got two arrays of integers a1, a2, ..., an and b1, b2, ..., bn of
length n. Also, you've got m queries of two types:

  1. Copy the subsegment of array a of length k, starting
    from position x, into array b, starting from position y,
    that is, execute by + q = ax + q for
    all integer q (0 ≤ q < k). The given operation
    is correct — both subsegments do not touch unexistent elements.
  2. Determine the value in position x of array b, that
    is, find value bx.

For each query of the second type print the result — the value of the corresponding element of array b.

Input

The first line contains two space-separated integers n and m (1 ≤ n, m ≤ 105) —
the number of elements in the arrays and the number of queries, correspondingly. The second line contains an array of integers a1, a2, ..., an (|ai| ≤ 109).
The third line contains an array of integers b1, b2, ..., bn (|bi| ≤ 109).

Next m lines contain the descriptions of the queries. The i-th
line first contains integer ti —
the type of the i-th query (1 ≤ ti ≤ 2).
If ti = 1, then
the i-th query means the copying operation. If ti = 2,
then the i-th query means taking the value in array b.
If ti = 1, then
the query type is followed by three integers xi, yi, ki (1 ≤ xi, yi, ki ≤ n) —
the parameters of the copying query. If ti = 2,
then the query type is followed by integer xi (1 ≤ xi ≤ n) —
the position in array b.

All numbers in the lines are separated with single spaces. It is guaranteed that all the queries are correct, that is, the copying borders fit into the borders of arrays a and b.

Output

For each second type query print the result on a single line.

Sample test(s)
input
5 10
1 2 0 -1 3
3 1 5 -2 0
2 5
1 3 3 3
2 5
2 4
2 1
1 2 1 4
2 1
2 4
1 4 2 1
2 2
output
0
3
-1
3
2
3
-1
题意:给你两个数字序列a[]和b[],有两种操作,一种是把起点为xi,长度为k的a[]的一段复制给以yi为起点,长度为k的b[],还有一种操作是询问当前b[x]的数字是什么。
思路:
这道题可以用线段树成段更新做,属于染色一类线段树题目,可以这么想,对于任意一个数,记录它有没有被a[]的其中一段覆盖了,如果被覆盖了,可以记录它被覆盖的a[]的那段的起点stra以及b[]被覆盖的起点strb,如果被覆盖,那么最后结果就是a[x1+strb-stra]。stra表示这一线段是否被a[]数组覆盖,如果没有覆盖,那么stra=0,如果覆盖,那么被a[]覆盖的区间范围是a[stra]~a[stra+k-1],strb同理,只不过记录的是b[]的开始位置。
对于操作1,输入x1,y1,k,只要使得区间[y1,y1+k-1]的stra变成x1,strb变成y1.
对于操作2,输入x1,在线段树中寻找,如果这一点(即[x1,x1])的stra是0,就输出c[x1],否则输出a[x1+strb-stra].

#include<stdio.h>
#include<string.h>
#define maxn 100006
int a[maxn],c[maxn];
int st1,st2,x1,y1,k;
struct node
{
int l,r,stra,strb;
}b[4*maxn]; void build(int l,int r,int i)
{
int mid;
b[i].l=l;b[i].r=r;b[i].stra=b[i].strb=0;
if(l==r)return;
mid=(l+r)/2;
build(l,mid,i*2);
build(mid+1,r,i*2+1);
} void update(int l,int r,int i)  //stra=x1,strb=y1;
{
int mid;
if(b[i].stra==x1 && b[i].strb==y1)return;
if(b[i].l==l && b[i].r==r){
b[i].stra=x1;b[i].strb=y1;return;
}
if(b[i].stra!=-1){
b[i*2].stra=b[i*2+1].stra=b[i].stra;
b[i*2].strb=b[i*2+1].strb=b[i].strb;
b[i].stra=b[i].strb=-1;
}
mid=(b[i].l+b[i].r)/2;
if(r<=mid)update(l,r,i*2);
else if(l>mid) update(l,r,i*2+1);
else {
update(l,mid,i*2);update(mid+1,r,i*2+1);
}
} void question(int id,int i)
{
int mid;
if(b[i].stra!=-1){
st1=b[i].stra;st2=b[i].strb;return;
}
mid=(b[i].l+b[i].r)/2;
if(id<=mid) question(id,i*2);
else question(id,i*2+1);
} int main()
{
int n,m,i,j,h,d,e,f,x;
while(scanf("%d%d",&n,&m)!=EOF)
{
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(i=1;i<=n;i++){
scanf("%d",&c[i]);
}
build(1,n,1);
while(m--){
scanf("%d",&h);
if(h==1){
scanf("%d%d%d",&x1,&y1,&k);
update(y1,y1+k-1,1);
}
else if(h==2){
scanf("%d",&x);
st1=st2=0;
question(x,1);
if(st1==0){
printf("%d\n",c[x]);continue;
}
else {
printf("%d\n",a[x-st2+st1]);continue;
}
}
}
}
return 0;
}

codeforces 292E. Copying Data的更多相关文章

  1. codeforces 292E. Copying Data 线段树

    题目链接 给两个长度为n的数组, 两种操作. 第一种, 给出x, y, k, 将a[x, x+k-1]这一段复制到b[y, y+k-1]. 第二种, 给出x, 输出b[x]的值. 线段树区间更新单点查 ...

  2. Croc Champ 2013 - Round 1 E. Copying Data 线段树

    题目链接: http://codeforces.com/problemset/problem/292/E E. Copying Data time limit per test2 secondsmem ...

  3. ACM: Copying Data 线段树-成段更新-解题报告

    Copying Data Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description W ...

  4. Croc Champ 2013 - Round 1 E. Copying Data 分块

    E. Copying Data time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  5. E. Copying Data 解析(線段樹)

    Codeforce 292 E. Copying Data 解析(線段樹) 今天我們來看看CF292E 題目連結 題目 給你兩個陣列\(a,b\),有兩種操作:把\(a\)的一段複製到\(b\),或者 ...

  6. Codeforces 950.E Data Center Maintenance

    E. Data Center Maintenance time limit per test 1 second memory limit per test 512 megabytes input st ...

  7. 14.8.4 Moving or Copying InnoDB Tables to Another Machine 移动或者拷贝 InnoDB 表到另外机器

    14.8.4 Moving or Copying InnoDB Tables to Another Machine 移动或者拷贝 InnoDB 表到另外机器 这个章节描述技术关于移动或者复制一些或者所 ...

  8. 14.6.2 Moving or Copying InnoDB Tables to Another Machine 移动或者copy InnoDB 表到另外的机器

    14.6.2 Moving or Copying InnoDB Tables to Another Machine 移动或者copy InnoDB 表到另外的机器 这个章节描述技术关于移动或者copy ...

  9. [Windows Azure] Data Management and Business Analytics

    http://www.windowsazure.com/en-us/develop/net/fundamentals/cloud-storage/ Managing and analyzing dat ...

随机推荐

  1. 【Java基础】IO 流

    IO 流 File 类 java.io.File 类是文件和文件目录路径的抽象表示形式,与平台无关. File 能新建.删除.重命名文件和目录,但 File 不能访问文件内容本身. 如果需要访问文件内 ...

  2. Java JVM——9.方法区

    前言 方法区是运行时数据区的最后一个部分: 从线程共享与否的角度来看: 大家可能在这里有些疑惑,方法区和元空间的关系到底是怎样的?请往下看,下面会为大家解惑. 栈.堆.方法区的交互关系 下面就涉及了对 ...

  3. 🎉 Element UI for Vue 3.0 来了!

    第一个使用 TypeScript + Vue 3.0 Composition API 重构的组件库 Element Plus 发布了 ~ 2016 年 3 月 13 日 Element 悄然诞生,经历 ...

  4. 摆脱 996——GitHub 热点速览 v.21.03

    作者:HelloGitHub-小鱼干 Twitter 有位程序员总结了本周的 GitHub 中文程序员的看点:国内程序员日常--考公务员.996.抢茅台.刷算法.整健康码.在本期热点速览里,小鱼干收录 ...

  5. ActiceMQ详解

    1. MQ理解 1.1 MQ的产品种类和对比 MQ即消息中间件.MQ是一种理念,ActiveMQ是MQ的落地产品. 消息中间件产品 各类MQ对比 Kafka 编程语言:Scala 大数据领域的主流MQ ...

  6. 24V降压5V芯片,5A,4.5V-30V输入,同步降压调节器

    PW2205开发了一种高效率的同步降压DC-DC转换器5A输出电流.PW2205在4.5V到30V的宽输入电压范围内工作集成主开关和同步开关,具有非常低的RDS(ON)以最小化传导损失.PW2205采 ...

  7. 什么是Etcd,如何运维Etcd ?

    介绍 ETCD 是一个分布式.可靠的 key-value 存储的分布式系统,用于存储分布式系统中的关键数据:当然,它不仅仅用于存储,还提供配置共享及服务发现:基于Go语言实现. ETCD的特点 简单: ...

  8. 前端面试准备笔记之JavaScript(04)

    01. DOM的本质 xml是一种可扩展的标记性语言,可扩展就是可以描述任何结构的数据,他是一棵树,可以自定义标签,可以自己扩展. html也是一种特定的xml,他规定了一些标签的名称,结构与xml是 ...

  9. ubuntu qt5.8 编译qtwebkit

    qtwebkit- 下载地址:http://download.qt.io/community_releases/5.8/5.8.0-final/ 问题一 出现如下错误 解决方法   sudo apt- ...

  10. 基于final shell的linux命令

    final shell操作教程: 1.查看API实时日志:cd ../../data/log/api tail -100f anyAPI-server.log2.关闭日志:control+c3.恢复实 ...