比赛 Asm.Def战记之圣地亚哥“杯2015 评测结果 AAAAAAAEEE
题目名称 Asm.Def的命令 最终得分 70
用户昵称 真香警告 运行时间 0.651 s
代码语言 C++ 内存使用 82.33 MiB
提交时间 2019-10-23 17:43:50
显示代码纯文本
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

const int maxn=1000100;
int n,q;
int cnt;

struct tree{
	int x;
	int y;
	int addx;
	int addy;
}t[4*maxn];

struct preson{
	int x;
	int y;
}p[maxn];

inline int read(){
	int w=1,x=0,ch=getchar();
	for(;ch<'0'||ch>'9';ch=getchar()) if(ch=='-') w=-1;
	for(;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
	return w*x;
}

void pushup(int rt){
	t[rt].x=t[rt<<1].x+t[rt<<1|1].x;
	t[rt].y=t[rt<<1].y+t[rt<<1|1].y;
}

void build(int rt,int l,int r){
	if(l==r){
		cnt++;
		t[rt].y=cnt;
		return ;
	}
	int mid=(l+r)>>1;
	build(rt<<1,l,mid);
	build(rt<<1|1,mid+1,r);
	pushup(rt);
}

void pushdown(int rt,int lenn){
	if(t[rt].addx){
		t[rt<<1].addx+=t[rt].addx;
		t[rt<<1|1].addx+=t[rt].addx;
		t[rt<<1].x+=t[rt].addx*(lenn-(lenn>>1));
		t[rt<<1|1].x+=t[rt].addx*(lenn>>1);
		t[rt].addx=0;
	}
	if(t[rt].addy){
		t[rt<<1].addy+=t[rt].addy;
		t[rt<<1|1].addy+=t[rt].addy;
		t[rt<<1].y+=t[rt].addy*(lenn-(lenn>>1));
		t[rt<<1|1].y+=t[rt].addy*(lenn>>1);
		t[rt].addy=0;
	}
}

void change(int rt,int l,int r,int L,int R,int dx,int dy){
	if(L<=l&&r<=R){
		t[rt].addx+=dx;
		t[rt].addy+=dy;
		t[rt].x+=dx;
		t[rt].y+=dy;
		return ;
	}
	pushdown(rt,r-l+1);
	int mid=(l+r)>>1;
	if(L<=mid) change(rt<<1,l,mid,L,R,dx,dy);
	if(R>mid) change(rt<<1|1,mid+1,r,L,R,dx,dy);
	pushup(rt);
}

void query(int rt,int l,int r,int L,int R){
	if(L<=l&&r<=R){
		cout<<t[rt].x<<".0 "<<t[rt].y<<".0 "<<'\n';
		return ;
	}
	int mid=(l+r)>>1;
	pushdown(rt,r-l+1);
	if(L<=mid) query(rt<<1,l,mid,L,R);
	if(R>mid) query(rt<<1|1,mid+1,r,L,R);
}

int main(){
	freopen("asm_command.in","r",stdin);
	freopen("asm_command.out","w",stdout);
	n=read(),q=read();
	int opt,x,y,dx,dy;
	if(n<=1000){
		for(register int i=1;i<=n;i++) p[i].y=i;
		while(q--){
			opt=read();
			if(opt==0){
				x=read();
				cout<<p[x].x<<".0 "<<p[x].y<<".0"<<'\n';
			}
			if(opt==1){
				cin>>x>>y>>dx>>dy;
				for(int i=x;i<=y;i++){
					p[i].x+=dx;
					p[i].y+=dy;
				}
			}
		}
	}
	else{
		build(1,1,n);
		while(q--){
			opt=read();
			if(opt==1){
				x=read(),y=read(),dx=read(),dy=read(); 
				change(1,1,n,x,y,dx,dy);
			}
			if(opt==0){
				x=read();
				query(1,1,n,x,x);
			}
		}	
	}
	return 0;
}