题目连接:点击打开链接
H -- 喵哈哈村的战斗魔法师丶坏坏い月
Time Limit:3s Memory Limit:256MByte
Submissions:472Solved:103
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
//
// main.cpp
// 1129 - 喵哈哈村的战斗魔法师丶坏坏い月
//
// Created by teddywang on 2017/6/24.
// Copyright © 2017年 teddywang. All rights reserved.
//
#include <iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long ll;
ll magic;
ll n,m;
ll s[1000][1000];
ll up[1000];
ll mx[1000];
int t;
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%lld%lld",&n,&m);
magic=sqrt(n);
memset(up,0,sizeof(up));
memset(mx,0,sizeof(mx));
if(n%magic!=0) magic++;
int pos1=0,pos2=0;
for(int i=0;i<n;i++)
{
ll a;
scanf("%lld",&a);
s[pos1][pos2]=a;
mx[pos1]=max(mx[pos1],a);
pos2++;
if(pos2==magic)
{
pos2=0;
pos1++;
}
}
for(int i=0;i<m;i++)
{
int op,l,r;
ll v;
scanf("%d%d%d%lld",&op,&l,&r,&v);
l--;r--;
if(op==1)
{
int ans=-2;
int p=l/magic;
if(l/magic==r/magic)
{
int st=l%magic,ed=r%magic;
for(int j=st;j<=ed;j++)
{
if(s[p][j]+up[p]>=v)
{
ans=p*magic+j;
break;
}
}
printf("%d\n",ans+1);
continue;
}
if(l%magic!=0)
{
int p2=l%magic;
for(int j=p2;j<magic;j++)
{
if(s[p][j]+up[p]>=v)
{
ans=p*magic+j;
break;
}
}
p++;
}
int rs=r/magic-1;
if(r%magic==magic-1||r==n-1)
rs++;
if(ans!=-2)
{
printf("%d\n",ans+1);
continue;
}
for(int j=p;j<=rs;j++)
{
if(mx[j]+up[j]>=v)
{
for(int k=0;k<magic;k++)
{
if(s[j][k]+up[j]>=v)
{
ans=j*magic+k;
break;
}
}
break;
}
}
if(ans!=-2)
{
printf("%d\n",ans+1);
continue;
}
if((r%magic!=magic-1)&&(r!=n-1))
{
for(int j=0;j<=r%magic;j++)
{
if(s[rs+1][j]+up[rs+1]>=v)
{
ans=(rs+1)*magic+j;
break;
}
}
}
printf("%d\n",ans+1);
}
else
{
int p=l/magic;
if(l/magic==r/magic)
{
int st=l%magic,ed=r%magic;
for(int j=st;j<=ed;j++)
{
s[p][j]+=v;
mx[p]=max(s[p][j],mx[p]);
}
continue;
}
if(l%magic!=0)
{
int p2=l%magic;
for(int j=p2;j<magic;j++)
{
s[p][j]+=v;
mx[p]=max(s[p][j],mx[p]);
}
p++;
}
int rs=r/magic-1;
if(r%magic==magic-1||r==n-1)
rs++;
for(int j=p;j<=rs;j++)
{
up[j]+=v;
}
if((r%magic!=magic-1)&&(r!=n-1))
{
for(int j=0;j<r%magic;j++)
{
s[rs+1][j]+=v;
mx[rs+1]=max(s[rs+1][j],mx[rs+1]);
}
}
}
}
}
}
。。。真搓