#include<cmath>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
#include<iostream>
#define REP(i,a,n)for(int i=a;i<=n;++i)
#define CLR(d,a)memset(d,a,sizeof(d)); using namespace std; void SetIO(string a){
string in=a+".in", out=a+".out";
freopen(in.c_str(),"r",stdin);
freopen(out.c_str(),"w",stdout);
} void End(){
fclose(stdin);
fclose(stdout);
} const int maxn=300000+4; int val[maxn]; int n,m; struct Queries{
int l,r,a,b;
Queries(int l=0,int r=0,int a=0,int b=0):l(l),r(r),a(a),b(b){}
}ask[maxn]; void Read(){
scanf("%d%d",&n,&m);
REP(i,1,n)scanf("%d",&val[i]);
REP(i,1,m){
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
ask[i]=Queries(a,b,c,d);
}
} int block, belong[maxn], A[maxn]; int get_belong(int i){ return (i-1)/block+1; } bool cmp(int i,int j){
if(belong[ask[i].l]==belong[ask[j].l]) return ask[i].r<ask[j].r;
return belong[ask[i].l]<belong[ask[j].l];
} void Build(){
block=sqrt(n);
REP(i,1,n) belong[i]=get_belong(i);
REP(i,1,m) A[i]=i;
sort(A+1,A+1+m,cmp);
} int count1[maxn]; struct BIT{
int C[2][maxn]; int lowbit(int t){return t&(-t);} void update(int pos,int o,int delta){
while(pos<=n){
C[o][pos]+=delta;
pos+=lowbit(pos);
}
} int query(int pos,int o){
int sum=0;
while(pos>0){
sum+=C[o][pos];
pos-=lowbit(pos);
}
return sum;
}
void Modify(int i,int delta){
if(i==0) return ;
update(i,0,delta);
count1[i]+=delta;
if(delta<0 && count1[i]==0) update(i,1,delta);
if(delta>0 && count1[i]==1) update(i,1,delta);
} }Tree; int ans1[maxn], ans2[maxn]; void Work(){
int l=1,r=1;
Tree.Modify(val[1],1);
REP(i,1,m){
int cur=A[i];
int l2=ask[cur].l;
int r2=ask[cur].r; if(r<r2) {
++r;
while(r<=r2){ Tree.Modify(val[r],1), ++r; }
--r;
}
else
while(r>r2) { Tree.Modify(val[r],-1), --r; } if(l<l2) {
while(l<l2){ Tree.Modify(val[l],-1); ++l; }
}
else {
--l;
while(l>=l2) { Tree.Modify(val[l],1), --l; }
++l;
} ans1[cur]=Tree.query(ask[cur].b,0)-Tree.query(ask[cur].a-1,0);
ans2[cur]=Tree.query(ask[cur].b,1)-Tree.query(ask[cur].a-1,1);
}
} void Print(){
REP(i,1,m)
printf("%d %d\n",ans1[i],ans2[i]);
} int main(){
SetIO("input");
Read();
Build();
Work();
Print();
End();
return 0;
}

[AHOI2013]作业 莫队 树状数组的更多相关文章

  1. BZOJ3236[Ahoi2013]作业——莫队+树状数组/莫队+分块

    题目描述 输入 输出 样例输入 3 4 1 2 2 1 2 1 3 1 2 1 1 1 3 1 3 2 3 2 3 样例输出 2 2 1 1 3 2 2 1 提示 N=100000,M=1000000 ...

  2. COGS.1822.[AHOI2013]作业(莫队 树状数组/分块)

    题目链接: COGS.BZOJ3236 Upd: 树状数组实现的是单点加 区间求和,采用值域分块可以\(O(1)\)修改\(O(sqrt(n))\)查询.同BZOJ3809. 莫队为\(O(n^{1. ...

  3. BZOJ 3236: [Ahoi2013]作业(莫队+树状数组)

    传送门 解题思路 莫队+树状数组.把求\([a,b]\)搞成前缀和形式,剩下的比较裸吧,用\(cnt\)记一下数字出现次数.时间复杂度\(O(msqrt(n)log(n)\),莫名其妙过了. 代码 # ...

  4. bzoj3236 作业 莫队+树状数组

    莫队+树状数组 #include<cstdio> #include<cstring> #include<iostream> #include<algorith ...

  5. BZOJ 3236 AHOI 2013 作业 莫队+树状数组

    BZOJ 3236 AHOI 2013 作业 内存限制:512 MiB 时间限制:10000 ms 标准输入输出     题目类型:传统 评测方式:文本比较 题目大意: 此时己是凌晨两点,刚刚做了Co ...

  6. BZOJ_3289_Mato的文件管理_莫队+树状数组

    BZOJ_3289_Mato的文件管理_莫队+树状数组 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号 .为了防止他人 ...

  7. bzoj 3289: Mato的文件管理 莫队+树状数组

    3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description Mato同学 ...

  8. 51nod 1290 Counting Diff Pairs | 莫队 树状数组

    51nod 1290 Counting Diff Pairs | 莫队 树状数组 题面 一个长度为N的正整数数组A,给出一个数K以及Q个查询,每个查询包含2个数l和r,对于每个查询输出从A[i]到A[ ...

  9. 【BZOJ3460】Jc的宿舍(树上莫队+树状数组)

    点此看题面 大致题意: 一棵树,每个节点有一个人,他打水需要\(T_i\)的时间,每次询问两点之间所有人去打水的最小等待时间. 伪·强制在线 这题看似强制在线,但实际上,\(pre\ mod\ 2\) ...

随机推荐

  1. layer-list

    <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android=" ...

  2. IPv6特性,以及SLAAC过程

    1. IPv6特性 支持即插即用: 路由器发现(Router Discovery):当一个节点连接到一个IPv6的链路上时,它能够发现本地的路由器,而不必借助动态主机配置协议(DHCP). 前缀发现( ...

  3. day05-2 变量、常量、注释以及内存管理

    目录 什么是变量 Python中定义变量 定义变量名的命名规范 什么是常量 定义常量 注释是什么 注释有什么用 内存管理(重要) 引用计数 垃圾回收机制 小整数池 定义变量的三个特征 什么是变量 变量 ...

  4. java导出html页面

    http://blog.csdn.net/zhyh1986/article/details/8727523#t6 http://blog.csdn.net/zuozuofuwaiwai/article ...

  5. POJ 1988 Cube Stacking( 带权并查集 )*

    POJ 1988 Cube Stacking( 带权并查集 ) 非常棒的一道题!借鉴"找回失去的"博客 链接:传送门 题意: P次查询,每次查询有两种: M x y 将包含x的集合 ...

  6. [luogu2592 ZJOI2008] 生日聚会 (计数dp)

    题目描述 今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party. hidadz带着朋友们来到花园中,打算坐成一排玩游戏.为了游戏不至于无聊,就座的方案应满足如下条件: 对于任意连续 ...

  7. [51nod1074]约瑟夫环V2

    N个人坐成一个圆环(编号为1 - N),从第1个人开始报数,数到K的人出列,后面的人重新从1开始报数.问最后剩下的人的编号. 例如:N = 3,K = 2.2号先出列,然后是1号,最后剩下的是3号. ...

  8. QT_圆_直线_三角t

    MyImgTest.h: #ifndef MYIMGTEST_H#define MYIMGTEST_H #include <QWidget> class MyImgTest : publi ...

  9. 小学生绞尽脑汁也学不会的python(面对对象-----类与类之间的关系)

    小学生绞尽脑汁也学不会的python(面对对象-----类与类之间的关系 1. 依赖关系. 最轻的一种关系 在方法中引入另一个类的对象 class Elephant: def __init__(sel ...

  10. javaScript将string转换成array,并将汉字按汉语拼音排序方法

    亲测,代码如下: var str = '中华人民共和国民主富强': var arr = str.split("");//字符串装换数组方法一 //arr = str.replace ...