您的位置:首页 > 其它

1129 - 喵哈哈村的战斗魔法师丶坏坏い月(线段树)@

2017-06-04 08:52 260 查看
1129 - 喵哈哈村的战斗魔法师丶坏坏い月

Time Limit:3s Memory Limit:256MByte

Submissions:343Solved:77

DESCRIPTION

坏坏い月是月大叔的ID,他是一个掌握者772002种魔法的物理系战士,最擅长的技能就是搞事。今天他又要开始搞事了。

给你nn个数,你需要实现一下操作:

l r v ,在[l,r]区间内找到第一个大于等于v的数,输出这个数的下标,如果找不到的话,请输出-1噢

l r v,让[l,r]区间所有数增加v

INPUT

输入第一行包含一个正整数t(1≤t≤100)t(1≤t≤100)
,表示有t组数据对于每组数据:第一行包含两个整数n(1≤n≤100000)n(1≤n≤100000),q(1≤q≤100000)q(1≤q≤100000),表示数的个数,以及询问的个数。第二行包含nn个整数ai(1≤ai≤1000000000)ai(1≤ai≤1000000000)接下来q行,每行四个整数opt(1≤opt≤2),l,r(1≤l≤r≤n),v(1≤v≤1000000000)opt(1≤opt≤2),l,r(1≤l≤r≤n),v(1≤v≤1000000000)

OUTPUT

对于每个询问,输出一行表示答案.

SAMPLE INPUT

1

5 3

1 2 3 4 5

1 1 2 3

2 1 2 3

1 1 2 3

SAMPLE OUTPUT

-1
1

SOLUTION

玲珑杯”ACM比赛 Round #15

#include<iostream>
#include<string>
#include<cstring>
#include<set>
#include<map>
#include<algorithm>
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
typedef long long LL;
struct node
{
LL cmax;
}sum[N<<2];
LL lazy[N<<2], a
;
void pushdown(int rt)
{
if(lazy[rt]!=0)
{
sum[rt<<1].cmax+=lazy[rt];
sum[rt<<1|1].cmax+=lazy[rt];
lazy[rt<<1]+=lazy[rt],lazy[rt<<1|1]+=lazy[rt];
lazy[rt]=0;
}
return ;
}
void pushup(int rt)
{
sum[rt].cmax=max(sum[rt<<1].cmax,sum[rt<<1|1].cmax);
return ;
}
void build(int l,int r,int rt)
{
if(l==r)
{
sum[rt].cmax=sum[rt].cmin=a[l];
return ;
}
sum[rt].cmax=0;
lazy[rt]=0;
int mid=(l+r)/2;
build(l,mid,rt<<1);
build(mid+1,r,rt<<1|1);
pushup(rt);
return ;
}
void update(int l,int r,int L,int R,int rt,LL w)
{
if(L>=l&&R<=r)
{
sum[rt].cmax+=w;
lazy[rt]+=w;
return ;
}
pushdown(rt);
int mid=(L+R)/2;
if(l<=mid) update(l,r,L,mid,rt<<1,w);
if(r>mid) update(l,r,mid+1,R,rt<<1|1,w);
pushup(rt);
return ;
}
int query(int l,int r,int L,int R,int rt,LL w)
{
if(sum[rt].cmax<w) return -1;
if(L==R) return L;
pushdown(rt);
pushup(rt);
int x=-1,y=-1;
int mid=(L+R)/2;
if(l<=mid) x=query(l,r,L,mid,rt<<1,w);
if(x!=-1) return x;
if(r>mid) y=query(l,r,mid+1,R,rt<<1|1,w);
return y;
}

int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int n, q;
scanf("%d %d", &n, &q);
memset(sum,0,sizeof(sum));
memset(lazy,0,sizeof(lazy));
for(int i=1;i<=n;i++)  scanf("%lld", &a[i]);
build(1,n,1);
while(q--)
{
int opt, l, r;
LL v;
scanf("%d %d %d %lld",&opt,&l,&r,&v);
if(opt==1)  printf("%d\n",query(l,r,1,n,1,v));
else  update(l,r,1,n,1,v);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: