codeforces 292E. Copying Data

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
这道题可以用线段树成段跟新做,属于染色一类线段树题目,可以定义两个变量stra,strb。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;
}
时间: 2024-11-02 09:24:42

codeforces 292E. Copying Data的相关文章

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

Copying Data Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Description 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

HIVE表数据的导入与导出(load data&amp;insert overwrite)

1. 准备测试数据 首先创建普通表: create table test(id int, name string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE; 创建分区表: CREATE EXTERNAL TABLE test_p( id int, name string ) partitioned by (date STRING) ROW FORMAT DELIMITED FIELDS TERMINATED

hive文件存储格式

hive在建表是,可以通过'STORED AS FILE_FORMAT' 指定存储文件格式 例如: [plain] view plain copy > CREATE EXTERNAL TABLE MYTEST(num INT, name STRING) > ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' > STORED AS TEXTFILE > LOCATION '/data/test'; 指定文件存储格式为"TEXTFI

hive表与外部表的区别

相信很多用户都用过关系型数据库,我们可以在关系型数据库里面创建表(create table),这里要讨论的表和关系型数据库中的表在概念上很类似.我们可以用下面的语句在Hive里面创建一个表: hive> create table wyp(id int, > name string, > age int, > tele string) > ROW FORMAT DELIMITED > FIELDS TERMINATED BY '\t' > STORED AS TEX

Hive数据导入——数据存储在Hadoop分布式文件系统中,往Hive表里面导入数据只是简单的将数据移动到表所在的目录中!

转自:http://blog.csdn.net/lifuxiangcaohui/article/details/40588929 Hive是基于Hadoop分布式文件系统的,它的数据存储在Hadoop分布式文件系统中.Hive本身是没有专门的数据存储格式,也没有为数据建立索引,只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据.所以往Hive表里面导入数据只是简单的将数据移动到表所在的目录中! Hive的几种常见的数据导入方式这里介绍四种:(1).从本地文件系统中

hive操作语句使用详解

#创建表人信息表  person(String name,int age) hive> create table person(name STRING,age INT)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' ESCAPED BY '\\' STORED AS TEXTFILE; OK Time taken: 0.541 seconds#创建表票价信息表 ticket(int age,float price) hive> create tab

NFS共享关系型数据库利用DNS轮询提供Web负载均衡

前言: 用NFS.LAMP.BIND结合的方法,应对网络中访问量增大而导致服务器负载运行的情况.以实现Web服务器之间使用同一个MYSQL和相同的网页配置文件. 实验环境: HostName IP 规划 nfs.preferred.com 192.168.1.6 NFS ns.preferred.com 192.168.1.5 DNS mysql.preferred.com 192.168.1.4 MYSQL www.preferred.com 192.168.1.3 WEB www.prefe

Mysql热备xtrabackup的使用

InnoDB 有个商业的InnoDB Hotbackup,可以对InnoDB引擎的表实现在线热备.而 percona出品的Xtrabackup,是InnoDB Hotbackup的一个开源替代品,可以在线对InnoDB/XtraDB引擎的表进行物理备份.mysqldump支持在线备份,不过是逻辑备份,效率比较差.当数据量比较小的时候,mysqldump还可以胜任,当数据量大的时候,恢复时间却让人无法忍受,于是开源工具xtrabackup就应运而生了,xtrabackup属于物理备份,效率很不错.

Hive表的分区与分桶

1.Hive分区表 Hive使用select语句进行查询的时候一般会扫描整个表内容,会消耗很多时间做没必要的工作.Hive可以在创建表的时候指定分区空间,这样在做查询的时候就可以很好的提高查询的效率. 创建分区表的语法: [java] view plain copy create table tablename( name string )partitioned by(key,type...); 示例 [java] view plain copy drop table if exists emp