#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<string>
#include<queue>
#include<map>
#include<cmath>
#include<set>
using namespace std;
#define mp make_pair
#define ll long long
#define N 600023
ll read()
{
ll f=1,x=0;
char c=getchar();
while(c>'9'||c<'0')
{
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=x*10+c-'0';
c=getchar();
}
return f*x;
}
int m;
struct ques{
int x1,x2,y1,y2;
double a;
}q[N];
struct node{
int pos,op;
double a;
bool operator < (const node A)const
{
return pos<A.pos;
}
};
int senum;
set<node>se[N];
map<int,int>mh,ml;
void add(int pos,int x,int op,int whc,double ta)
{
if(!whc)
{
if(!mh[pos]) mh[pos]=++senum;
int now=mh[pos];
se[now].insert(node{x,op,ta});
}
else
{
if(!ml[pos]) ml[pos]=++senum;
int now=ml[pos];
se[now].insert(node{x,op,ta});
}
}
void del(int pos,int x,int whc)
{
if(!whc)
{
int now=mh[pos];
se[now].erase(node{x,0,0});
}
else
{
int now=ml[pos];
se[now].erase(node{x,0,0});
}
}
int main()
{
//se[1].insert(node{1,0,0});
//se[1].erase(node{1,2,0.5});
//cout<<se[1].size()<<'\n';
// freopen("a.in","r",stdin);
m=read();
//if(m<=10000)
for(int i=1;i<=m;++i)
{
int op=read();
if(op==1)
{
q[i].x1=read(),q[i].y1=read(),q[i].x2=read(),q[i].y2=read();
cin>>q[i].a;
int tx=q[i].x2>q[i].x1?1:-1;
int ty=q[i].y2>q[i].y1?1:-1;
int nx=q[i].x1+tx,ny=q[i].y1+ty;
while(nx!=q[i].x2)
{
add(nx,ny,tx==ty,0,q[i].a);
add(ny,nx,tx==ty,1,q[i].a);
nx+=tx;ny+=ty;
}
}
if(op==2)
{
int id=read();
int tx=q[id].x2>q[id].x1?1:-1;
int ty=q[id].y2>q[id].y1?1:-1;
int nx=q[id].x1+tx,ny=q[id].y1+ty;
while(nx!=q[id].x2)
{
del(nx,ny,0);
del(ny,nx,1);
nx+=tx;ny+=ty;
}
}
if(op==3)
{
int nx=read(),ny=read(),d=read();
double I;
cin>>I;
int t=read();
//if(I>1.1) return 0;
//cout<<i<<"@str\n";
while(1)
{
// cout<<nx<<" "<<ny<<" "<<d<<" "<<I<<"POS"<<'\n';
bool flag=0;
if(d==0)
{
int now=ml[ny];
if(!now) flag=1;
else
{
auto it=se[now].upper_bound(node{nx,0,0});
if(it==se[now].end()) flag=1;
else
{
if(t<it->pos-nx) flag=1;
else
{
t-=it->pos-nx;
I*=it->a;
//cout<<I<<" "<<it->a<<"!!\n";
if(I<1.0)
{
printf("0 0 0\n");
break;
}
nx=it->pos;
if(it->op) d=1;
else d=3;
}
}
}
if(flag)
{
cout<<nx+t<<" "<<ny<<" "<<(int)floor(I)<<'\n';
break;
}
}
else if(d==1)
{
int now=mh[nx];
if(!now) flag=1;
else
{
auto it=se[now].upper_bound(node{ny,0,0});
if(it==se[now].end()) flag=1;
else
{
if(t<it->pos-ny) flag=1;
else
{
t-=it->pos-ny;
I*=it->a;
if(I<1.0)
{
printf("0 0 0\n");
break;
}
ny=it->pos;
if(it->op) d=0;
else d=2;
}
}
}
if(flag)
{
cout<<nx<<" "<<ny+t<<" "<<(int)floor(I)<<'\n';
break;
}
}
else if(d==2)
{
int now=ml[ny];
if(!now) flag=1;
else
{
auto it=se[now].lower_bound(node{nx,0,0});
if(it==se[now].begin()) flag=1;
else
{
it--;
if(t<nx-it->pos) flag=1;
else
{
t-=nx-it->pos;
I*=it->a;
if(I<1.0)
{
printf("0 0 0\n");
break;
}
nx=it->pos;
if(it->op) d=3;
else d=1;
}
}
}
if(flag)
{
cout<<nx-t<<" "<<ny<<" "<<(int)floor(I)<<'\n';
break;
}
}
else
{
int now=mh[nx];
if(!now) flag=1;
else
{
auto it=se[now].lower_bound(node{ny,0,0});
if(it==se[now].begin()) flag=1;
else
{
it--;
if(t<ny-it->pos) flag=1;
else
{
t-=ny-it->pos;
I*=it->a;
if(I<1.0)
{
printf("0 0 0\n");
break;
}
ny=it->pos;
if(it->op) d=2;
else d=0;
}
}
}
if(flag)
{
cout<<nx<<" "<<ny-t<<" "<<(int)floor(I)<<'\n';
break;
}
}
}
}
}
return 0;
}
csp 202206-4光线追踪 满分代码
最新推荐文章于 2024-03-08 09:04:33 发布