整体二分+树状数组套Treap,时间复杂度$O(n\log^3n)$。

#include<cstdio>
#include<cstdlib>
#include<algorithm>
#define N 100010
using namespace std;
int n,m,tot,i,X0,Y0,X1,Y1,cq,bx[N],by[N],bz[N],ans[N],tmp,C,D;char op[8];
struct P{
int a,b,c,d,k,p;
P(){}
P(int _a,int _b,int _c,int _d,int _k,int _p){a=_a,b=_b,c=_c,d=_d,k=_k,p=_p;}
}a[N],b[N],ql[N],qr[N];
inline int findl(int*a,int x){
int l=1,r=n,mid,t;
while(l<=r)if(a[mid=(l+r)>>1]>=x)r=(t=mid)-1;else l=mid+1;
return t;
}
inline int findr(int*a,int x){
int l=1,r=n,mid,t;
while(l<=r)if(a[mid=(l+r)>>1]<=x)l=(t=mid)+1;else r=mid-1;
return t;
}
struct node{
int p,val,v,sum;node*l,*r;
node(){val=v=sum=p=0;l=r=NULL;}
inline void up(){sum=v+l->sum+r->sum;}
}*blank=new(node),*bit[N],pool[6000000],*cur=pool;int pos[N],T;
inline void Rotatel(node*&x){node*y=x->r;x->r=y->l;x->up();y->l=x;y->up();x=y;}
inline void Rotater(node*&x){node*y=x->l;x->l=y->r;x->up();y->r=x;y->up();x=y;}
void Ins(node*&x){
if(x==blank){
x=cur++;x->val=C;x->l=x->r=blank;x->v=x->sum=D;x->p=std::rand();
return;
}
x->sum+=D;
if(C==x->val){x->v+=D;return;}
if(C<x->val){
Ins(x->l);
if(x->l->p>x->p)Rotater(x);
}else{
Ins(x->r);
if(x->r->p>x->p)Rotatel(x);
}
}
void Ask(node*&x,int a,int b){
if(x==blank)return;
if(C<=a&&b<=D){tmp+=x->sum;return;}
if(C<=x->val&&x->val<=D)tmp+=x->v;
if(C<x->val)Ask(x->l,a,x->val-1);
if(D>x->val)Ask(x->r,x->val+1,b);
}
inline void add(int x,int y,int p){for(C=y,D=p;x<=n;Ins(bit[x]),x+=x&-x)if(pos[x]<T)pos[x]=T,bit[x]=blank;}
inline int sum(int x,int l,int r){for(C=l,D=r,tmp=0;x;x-=x&-x)if(pos[x]==T)Ask(bit[x],0,n);return tmp;}
void solve(int l,int r,int L,int R){
if(L>R)return;
if(l==r){
for(int i=L;i<=R;i++)if(b[i].p)ans[b[i].p]=l;
return;
}
int mid=(l+r)>>1,i,cl=0,cr=0;
for(T++,i=L;i<=R;i++)if(!b[i].p){
if(b[i].k<=mid)add(b[i].a,b[i].b,b[i].c),ql[cl++]=b[i];else qr[cr++]=b[i];
}else{
int t=sum(b[i].b,b[i].c,b[i].d)-sum(b[i].a-1,b[i].c,b[i].d);
if(t>=b[i].k)ql[cl++]=b[i];else b[i].k-=t,qr[cr++]=b[i];
}
for(i=0;i<cl;i++)b[L+i]=ql[i];
for(i=0;i<cr;i++)b[L+cl+i]=qr[i];
solve(l,mid,L,L+cl-1),solve(mid+1,r,L+cl,R);
}
int main(){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
scanf("%d%d%d",&a[i].a,&a[i].b,&a[i].k);
bx[i]=a[i].a,by[i]=a[i].b,bz[i]=a[i].k;
}
sort(bx+1,bx+n+1),sort(by+1,by+n+1),sort(bz+1,bz+n+1);
for(i=1;i<=n;i++){
a[i].a=findl(bx,a[i].a);
a[i].b=findl(by,a[i].b);
a[i].k=findl(bz,a[i].k);
a[i].c=1;
b[i]=a[i];
}
tot=n;
while(m--){
scanf("%s%d%d",op,&X0,&Y0);
if(op[0]=='S'){
X0++,Y0++;
if(X0==Y0)continue;
b[++tot]=P(a[X0].a,a[X0].b,-1,0,a[X0].k,0);
b[++tot]=P(a[X0].a,a[X0].b,1,0,a[Y0].k,0);
b[++tot]=P(a[Y0].a,a[Y0].b,1,0,a[X0].k,0);
b[++tot]=P(a[Y0].a,a[Y0].b,-1,0,a[Y0].k,0);
swap(a[X0].k,a[Y0].k);
}else{
scanf("%d%d%d",&X1,&Y1,&i);
if(X0>X1)swap(X0,X1);
if(Y0>Y1)swap(Y0,Y1);
if(X0>bx[n]||X1<bx[1]||Y0>by[n]||Y1<by[1])X0=1,X1=Y0=Y1=0;
else{
X0=findl(bx,X0);
X1=findr(bx,X1);
Y0=findl(by,Y0);
Y1=findr(by,Y1);
}
b[++tot]=P(X0,X1,Y0,Y1,i,++cq);
}
}
solve(1,n+1,1,tot);
for(i=1;i<=cq;i++)if(ans[i]>n)puts("It doesn't exist.");else printf("%d\n",bz[ans[i]]);
return 0;
}

  

BZOJ2674 : Attack的更多相关文章

  1. 【Cocos2d-x for WP8 学习整理】(2)Cocos2d-Html5 游戏 《Fruit Attack》 WP8移植版 开源

    这一阵花了些时间,把 cocos2d-html5 里的sample 游戏<Fruit Attack>给移植到了WP8上来,目前已经实现了基本的功能,但是还有几个已知的bug,比如WP8只支 ...

  2. Web 服务器 low bandth DOS attack

    https://www.owasp.org/images/0/04/Roberto_Suggi_Liverani_OWASPNZDAY2010-Defending_against_applicatio ...

  3. CF 701B Cells Not Under Attack(想法题)

    题目链接: 传送门 Cells Not Under Attack time limit per test:2 second     memory limit per test:256 megabyte ...

  4. ASP.NET Padding Oracle Attack EXP

    #!/usr/bin/perl## PadBuster v0.3 - Automated script for performing Padding Oracle attacks# Brian Hol ...

  5. 人机接口设备攻击(HID Attack)

    人机接口设备攻击(HID Attack)   HID Attack是最近几年流行的一类攻击方式.HID是Human Interface Device的缩写,意思是人机接口设备.它是对鼠标.键盘.游戏手 ...

  6. Codeforces Round #364 (Div. 2) B. Cells Not Under Attack

    B. Cells Not Under Attack time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  7. PHP filesystem attack vectors - Take Two

    http://www.ush.it/2009/07/26/php-filesystem-attack-vectors-take-two/ Did you enjoyed our previous &q ...

  8. PHP filesystem attack vectors

    http://www.ush.it/2009/02/08/php-filesystem-attack-vectors/ On Apr 07, 2008 I spoke with Kuza55 and ...

  9. Padding Oracle Attack的一些细节与实现

    Padding Oracle Attack还是颇具威力的,ASP.NET的Padding Oracle Attack被Pwnie评为2010年最佳服务端漏洞之一.还是看 Juliano Rizzo a ...

随机推荐

  1. compact过滤数组中的nil

    http://ruby-doc.org/core-2.2.0/Array.html#method-i-compact compact → new_aryclick to toggle source R ...

  2. js检测是否安装了flash插件

    function flashChecker() { var hasFlash = 0; //是否安装了flash var flashVersion = 0; //flash版本 var isIE = ...

  3. [ruby on rails] 跟我学之(9)删除数据

    首先需要在index页加个删除链接,并提供一个删除的确认,用户确认删除时,直接删除数据. 修改views 修改 app/views/posts/index.html.erb,如下: <h1> ...

  4. linux之eval用法(高级bash程序员的必修之技)

    1. eval command-line 其中command-line是在终端上键入的一条普通命令行.然而当在它前面放上eval时,其结果是shell在执行命令行之前扫描它两次.如: pipe=&qu ...

  5. springMVC 上传文件

    spring mvc(注解)上传文件的简单例子,这有几个需要注意的地方1.form的enctype=”multipart/form-data” 这个是上传文件必须的2.applicationConte ...

  6. 43. 动态规划求解n个骰子的点数和出现概率(或次数)[Print sum S probability of N dices]

    [题目] 把N个骰子扔在地上,所有骰子朝上一面的点数之和为S.输入N,打印出S的所有可能的值出现的概率. [分析] 典型的动态规划题目. 设n个骰子的和为s出现的次数记为f(n,s),其中n=[1-N ...

  7. 如何分割一个utf8字符串(保证单个汉字的完整性)

    std::list<std::string> split_utf8_string(const std::string& text) { std::list<std::stri ...

  8. Android 中的Force Close

    今天写程序时遇到一个问题,领导希望在点击了setting里的force close 后,程序依然能够响应以前用alarmManager注册的receiver. 在网上看到了一些文章,写的是如何建立一个 ...

  9. sphinx 增量索引与主索引使用测试

    2013年10月28日 15:01:16 首先对新增的商品建立增量索引,搜索时只使用增量索引: array (size=1) 0 => array (size=6) 'gid' => st ...

  10. js: this,call,apply,bind 总结

    对js中的一些基本的很重要的概念做一些总结,对进一步学习js很重. 一.this JavaScript 中的 this 总是指向一个对象,而具体指向那个对象是在运行时基于函数的执行环境动态绑定的,而非 ...